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))!
}
我一直在使用下面的东西来做我的 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))!
}