我是Swift的新手。我将用Java术语解释我尝试做的事情,希望有人能帮助我理解。
我想要一个在视图控制器的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")
}
}
}
答案 0 :(得分:1)
_dictionary
提供初始值,因为必须为所有实例属性指定初始值。这是一个Swift安全功能,以确保所有实例在出生时都是良好的形式。您可以通过在实际的初始值设定项中初始化_dictionary
来完成此操作,但事实并非如此。您选择在viewDidLoad
中为其提供第一个“真实”值,这要晚得多。因此,在viewDidLoad
出现之前,您已强制自己提供“假的”初始值,并为您提供“真实的”初始值。
我不明白你的另一个问题,因为我不知道“拆包词典”是什么意思。但也许您指的是此代码中的其他内容。我会和你谈谈。
dico
是一个可选的包装字符串。它是一个可选项,因为String的contentsOfFile:
初始化程序返回一个Optional - 它是一个可用的初始化程序。这是因为可能没有这样的文件,或者该文件可能没有该编码,在这种情况下,初始化程序需要返回nil。
所以现在dico
是一个可选的包裹一个必须解开的字符串 - 或者是nil。因此,您将在下一行中将其解包为dico?
。假设dico?
不是零,dico
是一个字符串。
然后拨打componentsSeparatedByString
。它返回一个AnyObject
数组。因此,您已选择使用String
将其强制转换为as?
数组。我不知道为什么你选择使用as?
,因为你知道如果我们达到这一点,它将是String
的数组 - 就我个人而言,我会使用as
。但无论如何,as?
总是会返回一个可选项!因此,您可以选择使用if let
条件绑定来解包 。
具有讽刺意味的是,_dictionary
不是,也不会是或将成为字典 - 它是一个数组。你的名字(以及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数组),你可以跳过强制转换:
var err : NSError?
if let dico = String(contentsOfFile: path!,
encoding: NSUTF8StringEncoding, error: nil) {
_dictionary = dico.componentsSeparatedByString("\n")
} else {
println(err)
}