Ios Swift NSObject属性不是可选的,但打印时可选

Ios Swift NSObject属性不是可选的,但打印时可选,ios,swift,forced-unwrapping,Ios,Swift,Forced Unwrapping,上述代码的输出为: 所有地点可选(“地铁”) 在下面的代码中,var不是可选的。但是print语句将其打印为可选。它是否应该打印所有位置的“Subway” let allPlaces = resultsArray.map({ (param) -> Places in return Places(dictionary: param ) }) print("All P

上述代码的输出为:

所有地点可选(“地铁”)

在下面的代码中,var不是可选的。但是print语句将其打印为可选。它是否应该打印所有位置的“Subway”

let allPlaces = resultsArray.map({ (param) -> Places in
                        return Places(dictionary: param )
                    })
                    print("All Places \(allPlaces[0].placeName)")
类位置:NSObject{
变量名称:字符串!
init(字典:字典){
名称=字典[“名称”]作为?字符串
}
}

将“as?”更改为“as!”

  • 感叹号表示绝对清楚

  • 问号表示可选绑定

[来源]

class Places: NSObject {


    var name:String!


    init(dictionary:Dictionary<String, Any>) {

        name = dictionary["name"] as? String
    }
}

print("All Places \(allPlaces[0].placeName)")
您已将名称声明为隐式展开可选。从
Swift 3
开始,仅当需要在本地进行类型检查时,才将强制展开。否则,它将被视为正常可选

var name:String!
这里不涉及类型检查,所以名称仍然是可选的

如果你喜欢

 print("All Places \(allPlaces[0].name)")
输出将是“所有地方地铁”

或者你需要强制打开它

let name:String = allPlaces[0].name
print("All Places \(name)")   

如果
名称
为零,这将导致崩溃,您应该注意它。如果名称可能为零,则使用
var name:String?
以便编译器强制您显式展开。

从此处开始词典[“name”]as?它给出的字符串是可选的。将其更改为dictionary[“name”]as!字符串将为您提供非可选的打印方式(“所有位置”+所有位置[0]。地名)
字典[“名称”]as?字符串
使其成为可选值。请参阅–只要可以将IUO作为一个类型检查,它就会被视为强可选。无论何时放置
在“type”前面,它实际上是一个
可选的
类型。唯一的区别是,您告诉编译器,当您读取
name
属性时,您不想处理它的可空性(“因为您确定它永远不会是
nil
),但它仍然可能是
nil
。这么说来,您可以简单地将属性定义为
var name:String
。下面的答案@theodore cha如果“name”键不可用怎么办?@andyPaul我想。。使用双问号(设置默认值)//name=dictionary[“name”]as?一串“”@andyPaul双问号:如果值不可用,请保存默认值(“”@VinodKumar我添加了其他方法。
 print("All Places \(allPlaces[0].name)")
let name:String = allPlaces[0].name
print("All Places \(name)")   
 print("All Places \(allPlaces[0].name!)")