如何在Swift中为符合NSCoding协议的类实现可失败的初始值设定项?

如何在Swift中为符合NSCoding协议的类实现可失败的初始值设定项?,swift,Swift,如何为符合NSCoding协议的类实现可失败的初始值设定项 我收到以下错误: 1.行重写init(){}:属性“self.videoURL”未在隐式生成的super.init调用中初始化 2.行返回nil:在从初始值设定项返回nil之前,必须初始化类实例的所有存储属性 我见过,这对我帮助很大,但由于我的类也符合NSCoding协议,我不知道如何在我的例子中实现一个失败的初始化器 关于如何实现一个失败的初始化器有什么建议吗 class CustomMedia : NSObject, NSCodin

如何为符合NSCoding协议的类实现可失败的初始值设定项

我收到以下错误:
1.行
重写init(){}
:属性“self.videoURL”未在隐式生成的super.init调用中初始化
2.行
返回nil
:在从初始值设定项返回nil之前,必须初始化类实例的所有存储属性

我见过,这对我帮助很大,但由于我的类也符合NSCoding协议,我不知道如何在我的例子中实现一个失败的初始化器

关于如何实现一个失败的初始化器有什么建议吗

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
  }
}

更新:这在Swift 2.2更新中得到了解决,在初始化失败之前,您不再需要分配nil值并调用super

对于Swift 2.2之前的版本:

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

以下是可行的解决方案:

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
   }
}

为什么要执行
重写init(){}
?@DanVanWinkle我在其他示例中看到它是以这种方式实现的,以符合NSCoding,并且它没有导致任何错误。太好了,我已经把它注释掉了,第一个错误消失了。我该怎么做呢?我把
videoURL=NSURL(字符串:https://www.google.com/")!在返回nil之前,但它不起作用。Sitll得到错误:在从初始值设定项返回nil之前,必须初始化类实例的所有存储属性。我必须在返回nil之前输入上面的代码,并且必须清理项目。否则我就得到了上面的错误。无法理解,因为我没有在每次生成之前清理项目。@Andrej您可以只分配nil,因为类型是可选的,您不必创建有效的URL。不,videoURL不是可选的,所以我不能将其设置为nil。只有videoTitle是可选的,在返回nil之前不需要初始化。也许你没有注意到
var-videoURL:NSURL中的“!”
NSURL
是可选类型,它是隐式展开的可选类型。当它为
nil
时,您无法引用它而不会导致崩溃。不过,您完全可以指定
nil