2014-09-09 7 views
9

Ich versuche, das NSCoding-Protokoll auf eine Klasse zu verwenden, die ich in swift geschrieben habe, kann aber nicht herausfinden, warum der Compiler beschwert, dass es "nicht NSCoding-Protokoll entspricht", wenn ich Implementiere die erforderlichen Methoden:Swift: Entspricht nicht dem Protokoll 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") 
    } 

} 

Ist das ein Fehler oder fehle ich gerade etwas?

Antwort

17

Wie Sie in den ausführlichen Compiler-Meldungen im Berichtsnavigator sehen können, Ihre Methoden sind nicht richtig erklärt:

 
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!) { 

(. Das zwischen den Beta-Versionen geändert hat) Darüber hinaus ist die initWithCoder Methode werden, wie required gekennzeichnet:

required init(coder aDecoder: NSCoder) { } 

func encodeWithCoder(_aCoder: NSCoder) { } 

In Swift 3 die erforderlichen Methoden sind

required init(coder aDecoder: NSCoder) { } 

func encode(with aCoder: NSCoder) { } 
+2

"Das könnte sich zwischen den Beta-Versionen geändert haben" _ Wie kannst du es wagen, mir zu sagen, dass sie jetzt falsch liegen !? " Aber das ist natürlich das Leben in der schnelllebigen Beta-Spur ... – matt

+0

@matt: Zumindest druckt der Compiler hier eine sinnvolle Nachricht, anstatt * "$% §? & Kann nicht in UInt8 konvertiert werden" * :) –

+0

Außer dass die Hälfte der Zeit ist der Parameter, über den es sich beschwert, der falsche! :)) – matt

4

Die Parameter sind nicht implizit ausgepackt, und der Initialisierer erfordert die required Modifikator (das entfernen!):

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

Für Swift 3

Eine kleinere, aber wichtige Änderung war verpflichtet. Die Methode init ist gleich, aber die Methode encodeWithCoder wurde geändert.

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

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

Für Swift 3 (auf Xcode 8.2 Beta (8C23))

Es scheint wieder geändert zu haben. Dies ist die einzige Variante, die ich zur Arbeit bekommen könnte ...