Swift选项及其实例化

时间:2014-12-31 21:45:21

标签: ios swift nsarray optional

我是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")
       }
    }    
}

1 个答案:

答案 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)
    }