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)
问题是如何采取临时措施并将其命名?
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 ),它会触发异常)。
该代码还可以让您更好地调试 - 如果tempName是nil,则该键不存在或相应的值属于不同类型。
| 归档时间: |
|
| 查看次数: |
33203 次 |
| 最近记录: |