如何解决Swift变量:处理此字符串声明的最佳方法?
我正在Swift引导游乐场中工作,并遇到了这个示例。
示例代码采用字典(种类)数组并搜索最大数量。练习是找到最大的数字,然后返回数字的种类。
let interestingNumbers = [
"Prime": [2,3,5,7,11,13],"Fibonacci": [1,1,2,8],"Square": [1,4,9,16,25],]
var largest = 0
for (kind,numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
print(largest)
在此示例中,最大的数字是25,是“平方”类型。
我的直觉是添加一个名为“ largestKind”的新字符串变量,并在largest(Int)之后声明它。
let interestingNumbers = [
"Prime": [2,]
var largest = 0
var largestKind: String
for (kind,numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
largestKind = kind
}
}
}
print(largest)
print(largestKind) // error: Variable 'largestKind' used before being initialized
但是,Swift抛出此错误,表明我在使用它之前没有初始化maximumKind。我想将maximumKind设置为kind不等于初始化吗?
- 使用占位符字符串(例如var maximumKind =“”)初始化maximumKind
- 将largeKind作为可选项处理,然后解开print(largestKind!)
示例1:
let interestingNumbers = [
"Prime": [2,]
var largest = 0
var largestKind = ""
for (kind,numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
largestKind = kind
}
}
}
print(largest)
print(largestKind)
示例2:
let interestingNumbers = [
"Prime": [2,]
var largest = 0
var largestKind: String?
for (kind,numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
largestKind = kind
}
}
}
print(largest)
print(largestKind!)
解决此错误的最佳实践是什么?另外,当我将值设置为另一个变量时为什么会出现初始化错误?
解决方法
我可以查看您的数据和您的代码,并且可以看到由于包含大于0的数字,始终会初始化maximumKind。
但是,根据编译器使用的规则,不能保证设置了maximumKind。这就是为什么您在编译时收到错误消息的原因:因为根据编译器,在使用largeKind时,可能不会对其进行初始化。
您可以通过两种方式解决此问题:一种,初始化var maximumKind =“”。现在,largestKind总是被初始化。二,您声明var maximumKind:字符串?现在它是一个可选字符串,并且可选选项始终会自动初始化为nil。
在第二种情况下,如果调用print(largestKind!),则告诉编译器“如果largeKind为nil,请在运行时使程序崩溃”。那是一场等待发生的事故。使用强制展开!仅在绝对确定不能为零时才应使用。您可以检查if let largestKind = largestKind { }
之类的打印内容,也可以编写print (largestKind ?? "")
来打印{{1}},如果不为nil,则将显示maximumKind,否则为空字符串。
根据您的示例,我会说var maximumKind =“”,因为您将始终拥有最大的种类值。但是,在另一种情况下,如果不能保证这样做,则应使用var maximumKind:String?
不确定第二个问题的意思。该错误是由var maximumKind:String
导致的 ,您收到错误,因为不能保证将初始化maximumKind。顺便说一句,在示例2中,请勿强行打开可选包装。如果未初始化,则您的应用程序将崩溃。
最佳做法是使用if let
或guard let
打开可选项。
if let largestKind = largestKind {
// your code
}
或使用nil合并运算符提供默认值
largestKind ?? "none"
请注意,如果您要查找最大值,则可以使用更高的功能来达到此目的。您可以通过紧凑映射字典值来找到它们的最大值,并获得最大键值对:
if let (kind,largest) = interestingNumbers.compactMapValues({$0.max()}).max(by: {$0.value < $1.value}) {
print("kind:",kind,"largest:",largest) // kind: Square largest: 25
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。