gpt4 book ai didi

string - 施放 NSString!快速字符串

转载 作者:IT王子 更新时间:2023-10-29 05:24:23 31 4
gpt4 key购买 nike

我在字符串中有一个实例变量名

var name: String

我的类实现了 NSCoding 协议(protocol)。所以对于我的名字

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

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

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

var temp = aDecoder.decodeObjectForKey(kName) as NSString!
self.name = aDecoder.decodeObjectForKey(kName) as String

并意识到值 temp 持有正确的 NSString 值。所以我认为下面的行会修复它,但它会发出链接器错误:

self.name = aDecoder.decodeObjectForKey(kName) as NSString!

问题是如何取临时值并将其命名?

最佳答案

decodeObjectForKey 返回一个可选的 AnyObject?,因此您必须保护您的代码免受可能的 nil 值的影响。对强制解包使用强制转换听起来并不安全。

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

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

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

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

关于string - 施放 NSString!快速字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25946715/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com