微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift变量:处理此字符串声明的最佳方法?

如何解决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不等于初始化吗?

我发现此错误有两种解决方法

  1. 使用占位符字符串(例如var maximumKind =“”)初始化maximumKind
  2. 将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 letguard 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 举报,一经查实,本站将立刻删除。