NSMutableArray 实例,在 SWIFT 中默认是可选的吗?

Is NSMutableArray instance, optional by default in SWIFT?

我一直在使用下面的东西来做我的 plist 并在 Table 视图中保存数据和显示 plist 的内容。我正在使用 NSMutableArray 来获取数组的内容并将其显示在 table 视图中。 VC1 是我的 table 视图 & VC2 是我的 EnterDetail VC 所以我声明我的代码如下 -

class ListTableViewController: UITableViewController
{
var arr = NSMutableArray()

    var plistfinalpath = String()

    override func viewDidLoad()
    {
        super.viewDidLoad()


    }


    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()

    }
    override func viewDidAppear(animated: Bool)
    {


            let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0]
            plistfinalpath = path.stringByAppendingString("/login.plist")
            print(plistfinalpath)
        arr = (NSMutableArray(contentsOfFile: plistfinalpath))!
            print("time of appearing\(arr)")

       /* if let temparray = NSMutableArray(contentsOfFile: plistfinalpath)
        {
            arr = temparray
        }*/




        self.tableView.reloadData()

    }

所以你可以看到我已经将 'arr' 声明为 NSMutable 数组类型并且它不是可选的。当我在我的 didappear() 中使用时,编译器强制我强制解包它。为什么会这样,为什么即使我已将 'arr' 声明为非可选的,它也会发生?每当我第一次 运行 我的应用程序时,真正的问题就来了,plist 是空的意味着 'arr' 也是空的。而且由于我使用了强制解包,我的应用程序因致命错误而崩溃。如果我在上面的代码中取消注释我的注释行,if let 部分,它工作正常。所以有什么建议。谢谢

像这样声明

var arr : NSMutableArray = []

// Or

var arr : NSMutableArray!

你的 NSMutableArray 没有问题。

var arr = NSMutableArray()

创建数组的非可选实例。到目前为止,还不错...一个表达式

NSMutableArray(contentsOfFile: plistfinalpath)

可以return nil,所以它return是可选值。在这里你尝试创建另一个 NSMutableArray 实例并将结果分配给你的 var arr.

A mutable array containing the contents of the file specified aPath. Returns nil if the file can’t be opened or if the contents of the file can’t be parsed into a mutable array.

可能最适合您的方法是

import Foundation
var arr = NSMutableArray(contentsOfFile: "somePath") ?? NSMutableArray()

如果文件尚不存在(或发生其他故障),您的变量保证具有默认值(NSMutableArray 的空实例)

要解决您的致命错误,请检查您的文件是否存在 :-

   //Check whether your file exist or not
 let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0]
        plistfinalpath = path.stringByAppendingString("/login.plist")
    if NSFileManager.defaultManager().fileExistsAtPath(plistfinalpath)
    {
        arr = (NSMutableArray(contentsOfFile: plistfinalpath))!
    }