加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

投射NSString!快速的字符串

发布时间:2020-12-14 05:20:19 所属栏目:百科 来源:网络整理
导读:我在String中有一个实例变量名 var name: String 我的类实现了NSCoding协议.所以我的名字 func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(self.name,forKey: kName)}required init(coder aDecoder: NSCoder) { self.name = aDecoder.decodeOb
我在String中有一个实例变量名
var name: String

我的类实现了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
}

结果?我在解码器启动时遇到运行时崩溃.我将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"
    }

注意可选的downcasting的用法,它总是产生一个结果(nil或一个有效的类型值),而不是NSString!,如果下拉列表不可能触发异常(例如,如果你期望一个字符串,但它是一个int代替).

该代码还将允许您更好地调试 – 如果tempName为nil,则该键不存在或相应的值为不同类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读