首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Swift中为符合NSCoding协议的类实现可故障初始化器?

如何在Swift中为符合NSCoding协议的类实现可故障初始化器?
EN

Stack Overflow用户
提问于 2015-11-23 20:44:54
回答 1查看 275关注 0票数 0

如何为符合NSCoding协议的类实现可故障初始化器?

我得到以下错误:

  1. override init() {}:在隐式生成的super.init调用时未初始化的属性“self.videoURL”
  2. return nil:在从初始化器返回nil之前,必须初始化类实例的所有存储属性。

我见过Best practice to implement a failable initializerAll stored properties of a class instance must be initialized before returning nil,这对我有很大帮助,但是由于我的课也符合NSCoding协议,我不知道在我的情况下如何实现一个可失败的初始化器。

对于如何实现可故障初始化器有任何建议吗?

代码语言:javascript
复制
class CustomMedia : NSObject, NSCoding {
  var videoTitle: String?
  let videoURL: NSURL!

  override init() {}

  init?(title: String?, urlString: String) {
    // super.init()
    if let url = NSURL(string: urlString) {
       self.videoURL = url
       self.videoTitle = title
    } else {
       return nil
    }
  }

  func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(self.videoTitle, forKey: PropertyKey.videoTitle)
    aCoder.encodeObject(self.videoURL, forKey: PropertyKey.videoURL)
  }

  required init(coder aDecoder: NSCoder) {
    videoTitle = aDecoder.decodeObjectForKey(PropertyKey.videoTitle) as? String
    videoURL = aDecoder.decodeObjectForKey(PropertyKey.videoURL) as! NSURL
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-23 21:03:13

update :这在SWIFT2.2更新中得到了解决,您不再需要在初始化程序失败之前分配一个零值并调用超级。

用于2.2之前的Swift版本:

不幸的是,在返回nil之前,您实际上必须初始化您的值。

以下是解决方案:

代码语言:javascript
复制
class CustomMedia : NSObject, NSCoding {
   var videoTitle: String?
   var videoURL: NSURL!

   init?(title: String?, urlString: String) {
      super.init()

      if let url = NSURL(string: urlString) {
         self.videoURL = url
         self.videoTitle = title
      } else {
         self.videoURL = nil
         self.videoTitle = nil
         return nil
      }
   }

   func encodeWithCoder(aCoder: NSCoder) {
      aCoder.encodeObject(self.videoTitle, forKey: PropertyKey.videoTitle)
      aCoder.encodeObject(self.videoURL, forKey: PropertyKey.videoURL)
   }

   required init(coder aDecoder: NSCoder) {
      videoTitle = aDecoder.decodeObjectForKey(PropertyKey.videoTitle) as? String
      videoURL = aDecoder.decodeObjectForKey(PropertyKey.videoURL) as! NSURL
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33880360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档