簡體   English   中英

Swift:不符合協議NSCoding

[英]Swift: Does not conform to protocol NSCoding

我試圖在我用swift編寫的類上使用NSCoding協議,但似乎無法弄清楚為什么當我實現所需的方法時編譯器抱怨它“不符合協議NSCoding”:

class ServerInfo: NSObject, NSCoding {

    var username = ""
    var password = ""
    var domain = ""
    var location = ""
    var serverFQDN = ""
    var serverID = ""

    override init() {

    }

    init(coder aDecoder: NSCoder!) {
        self.username = aDecoder.decodeObjectForKey("username") as NSString
        self.password = aDecoder.decodeObjectForKey("password") as NSString
        self.domain = aDecoder.decodeObjectForKey("domain") as NSString
        self.location = aDecoder.decodeObjectForKey("location") as NSString
        self.serverFQDN = aDecoder.decodeObjectForKey("serverFQDN") as NSString
        self.serverID = aDecoder.decodeObjectForKey("serverID") as NSString
    }


    func encodeWithCoder(_aCoder: NSCoder!) {
        _aCoder.encodeObject(self.username, forKey: "username")
        _aCoder.encodeObject(self.password, forKey: "password")
        _aCoder.encodeObject(self.domain, forKey: "domain")
        _aCoder.encodeObject(self.location, forKey: "location")
        _aCoder.encodeObject(self.serverFQDN, forKey: "serverFQDN")
        _aCoder.encodeObject(self.serverID, forKey: "serverID")
    }

}

這是一個錯誤還是我錯過了一些東西?

正如您在報告導航器中的詳細編譯器消息中所看到的,您的方法未正確聲明:

error: type 'ServerInfo' does not conform to protocol 'NSCoding'
class ServerInfo: NSObject, NSCoding {
^
Foundation.NSCoding:2:32: note: protocol requires function 'encodeWithCoder' with type '(NSCoder) -> Void'
  @objc(encodeWithCoder:) func encodeWithCoder(aCoder: NSCoder)
                               ^
note: candidate has non-matching type '(NSCoder!) -> ()'
    func encodeWithCoder(_aCoder: NSCoder!) {
         ^
Foundation.NSCoding:3:25: note: protocol requires initializer 'init(coder:)' with type '(coder: NSCoder)'
  @objc(initWithCoder:) init(coder aDecoder: NSCoder)
                        ^
note: candidate has non-matching type '(coder: NSCoder!)'
    init(coder aDecoder: NSCoder!) {

(這可能在beta版本之間發生了變化。)此外,必須將initWithCoder方法標記為required

required init(coder aDecoder: NSCoder) {   }

func encodeWithCoder(_aCoder: NSCoder) {   }

Swift 3中 ,所需的方法是

required init(coder aDecoder: NSCoder) {   }

func encode(with aCoder: NSCoder) {   }

參數不是隱式解包(刪除!),初始化程序需要required修飾符:

required init(coder aDecoder: NSCoder) {
...
func encodeWithCoder(_aCoder: NSCoder) {

對於Swift 3

已經提出了一個小但重要的變化。 init方法相同,但encodeWithCoder方法已被修改。

   required init(coder aDecoder: NSCoder) {
    ...
   }

   func encode(with _aCoder: NSCoder) { 
   ...
   }

對於Swift 3(在Xcode 8.2 beta(8C23)上)

它似乎又改變了。 這是我可以開始工作的唯一變種......

func encodeWithCoder(_ _aCoder: NSCoder) {
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM