gpt4 book ai didi

ios - Swift 可选值及其实例化

转载 作者:行者123 更新时间:2023-11-29 02:24:24 25 4
gpt4 key购买 nike

我是 Swift 的新手。我将用 Java 术语解释我想做的事情,希望有人能帮助我理解。

我想要一个在 View Controller 的 viewDidLoad 中实例化/设置的类作用域数组。这听起来很简单,但这是我必须做的才能让它发挥作用。有人可以向我解释为什么 _dictionary 必须实例化为空数组以及为什么我需要使用 as 吗?即使 componentsSeparatedByString 函数返回一个数组,当解包字典时?谢谢。

class ViewController: UIViewController, UITextFieldDelegate
{
var _dictionary : [String] = []
override func viewDidLoad()
{
super.viewDidLoad()
let bundle = NSBundle.mainBundle()
let path = bundle.pathForResource(“TextFile”, ofType: "txt")
var err: NSError?
let dico = NSString(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: &err)
if let dictionary = dico?.componentsSeparatedByString("\n") as? [String]
{
_dictionary = dictionary
}
else
{
println("Error reading dictionary")
}
}
}

最佳答案

_dictionary 必须指定一个初始值,因为所有 实例属性都必须指定一个初始值。这是一个 Swift 安全功能,可确保所有实例在出生时都格式良好。您可以通过在实际的初始化程序中初始化 _dictionary 来完成此操作,但您没有这样做。您选择在 viewDidLoad 中为其提供第一个“真实”值,这要晚得多。因此,您必须强制自己提供“假”初始值,直到 viewDidLoad 出现并为您提供“真实”初始值。

我不明白你的其他问题,因为我不知道“拆包字典”是什么意思。但也许您指的是这段代码中的其余内容。我会告诉你它。

  • dico 是一个包装字符串的可选值。它是一个Optional,因为String 的contentsOfFile: 初始化器返回一个Optional - 它是一个失败初始化器。这是因为可能不存在这样的文件,或者该文件可能没有该编码,在这种情况下初始化程序需要返回 nil。

  • 所以现在 dico 是一个可选的包装必须解开的字符串 - 或为零。所以你在下一行中将其解包为 dico? 。假设 dico 不为 nil,此时 dico? 是一个字符串。

  • 然后调用componentsSeparatedByString。它返回一个 AnyObject 数组。因此,您选择使用 as? 将其转换为 String 数组。我不知道你为什么选择使用 as? 因为你知道如果我们到达这一点,它将是一个 String 数组 - 就我个人而言,我会使用 作为。但无论如何,as? 总是返回一个Optional!因此,您可以选择使用 if let 条件绑定(bind)来解开那个

具有讽刺意味的是,_dictionary 不是、也从来不是、也不会是字典 - 它是一个数组。你给这个(和字典)起的名字选得非常糟糕! dico 是一个字符串,dictionary_dictionary 是数组。看不到字典。

假设我们保留您相当奇怪的名字,您可以更简单、更清楚地完成这一切,如下所示:

var err : NSError?
if let dico = NSString(contentsOfFile: path!,
encoding: NSUTF8StringEncoding, error: nil) {
_dictionary = dico.componentsSeparatedByString("\n") as [String]
} else {
println(err)
}

此外,如果你从 String 类而不是 NSString 类开始,那么 componentsSeparatedByString 将是一个 String 数组,而不是一个无类型的 NSArray(即 AnyObject 数组),你可以跳过 Actor 阵容:

var err : NSError?
if let dico = String(contentsOfFile: path!,
encoding: NSUTF8StringEncoding, error: nil) {
_dictionary = dico.componentsSeparatedByString("\n")
} else {
println(err)
}

关于ios - Swift 可选值及其实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com