我在 swift 中parseJSON()
函数中有此代码,它将检索 json 文件中的Makes
,但我收到一个错误,说fatal error: unexpectedly found nil while unwrapping an Optional value
注意:我正在使用 SwiftyJSON,错误指向if condition
func parseJSON() {
let path: String = NSBundle.mainBundle().pathForResource("vehicles", ofType: "json") as String!
let jsonData = NSData(contentsOfFile: path) as NSData!
let readableJSON = JSON(data: jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil)
numberOfRows = readableJSON.count
for element in 1...numberOfRows {
var Makes = readableJSON[element]["Make"]
if !makeArray.contains(Makes.string! && ){ // error is pointing here!
let Make = readableJSON[element]["Make"].string as String!
makeArray.append(Make)
}
}
}
SwiftyJSON 对象的 .string
属性是一个可选的 getter。
其值可以存在,也可以为零。
因此,您必须在使用前安全地打开包装。
最简单的例子:
if let makeString = Makes.string {
if !makeArray.contains(makeString) {
let Make = readableJSON[element]["Make"].stringValue
makeArray.append(Make)
}
}
如您所注意到的,对于 SwiftyJSON,与可选的 .string
getter 相反的是非可选的 .stringValue
getter。
但要小心!如果此属性为 nil,则应用将崩溃。
.stringValue
与.string!
相同
因此,您也可以在那里使用可选的 getter 和"if let":
if let makeString = Makes.string {
if !makeArray.contains(makeString) {
if let Make = readableJSON[element]["Make"].string {
makeArray.append(Make)
} else {
// readableJSON[element]["Make"].string is nil, handle the error
}
}
} else {
// Makes.string is nil, handle the error
}
等等,你明白了。
也可以通过使用where
来简化:
if let makeString = Makes.string where !makeArray.contains(makeString) {
if let Make = readableJSON[element]["Make"].string {
makeArray.append(Make)
} else {
// readableJSON[element]["Make"].string is nil, handle the error
}
} else {
// Either Makes.string is nil or makeArray does contain it, handle the rror
}