施展NSString!to swift中的String

Ara*_*ash 13 string casting nscoding nsstring swift

我在String中有一个实例变量名

var name: String
Run Code Online (Sandbox Code Playgroud)

我的类实现了NSCoding协议.所以我的名字

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(self.name, forKey: kName)
}

required init(coder aDecoder: NSCoder) {
    self.name = aDecoder.decodeObjectForKey(kName) as String  // CRASH HERE
}
Run Code Online (Sandbox Code Playgroud)

结果?我在使用解码器启动时遇到了运行时崩溃.我将init更改为:

var temp = aDecoder.decodeObjectForKey(kName) as NSString!
self.name = aDecoder.decodeObjectForKey(kName) as String
Run Code Online (Sandbox Code Playgroud)

并意识到值temp保持正确的NSString值.所以我认为下面的行将解决它,但它会发出一个链接器错误:

self.name = aDecoder.decodeObjectForKey(kName) as NSString!
Run Code Online (Sandbox Code Playgroud)

问题是如何采取临时措施并将其命名?

Ant*_*nio 4

decodeObjectForKey返回一个可选的AnyObject?,所以你必须保护你的代码免受可能的 nil 值的影响。使用强制展开的演员听起来并不安全。

我无法重现该错误(因此问题可能出在代码中的其他位置),但这就是我在初始化属性时的处理方法name

    var tempName = aDecoder.decodeObjectForKey("name") as? String
    if let tempName = tempName {
        self.name = tempName
    } else {
        self.name = "some initial value"
    }
Run Code Online (Sandbox Code Playgroud)

注意可选的 downcasting 的使用as?,它总是产生一个结果(nil 或有效的类型值),而不是 ,as NSString!如果向下转换不可能(例如,如果您期望一个字符串,但它是一个 int ),它会触发异常)。

该代码还可以让您更好地调试 - 如果tempNamenil,则该键不存在或相应的值属于不同类型。

  • 您可以使用 Swift 的 nil-coalescing 运算符将 if/else 逻辑替换为表达式,如下所示: `self.name = tempName ?? “一些初始值”` (5认同)