2014-11-08 16 views
29

Ich versuche, eine Swift-Klasse zu implementieren, mussSwift: Typ XXX-Protokoll entsprechen müssen ‚NSObjectProtocol‘

  1. Vererben von einer Objective-C-Klasse
  2. ein Objective-C-Protokoll mit Klassenvariable implementieren.

Obwohl die Objective-C-Klasse-I-Subklassen sind von NSObject erbt, erhalte ich folgende Kompilierungsfehler:

Type DDBItem must conform to protocol 'NSObjectProtocol'

Das Objective-C-Klasse und Objective-C-Protokoll Ich bin vererben/erhältlich bei https://github.com/aws/aws-sdk-ios/blob/master/DynamoDB/AWSDynamoDBObjectMapper.h

AWSDynamoDBModel implementieren hat eine lange Kette von Erbschaft, die schließlich beginnt mit NSObject AWSDynamoDBModeling enforc ist zwei Klassenvariablen.

Mein Code ist

class DDBItem : AWSDynamoDBModel, AWSDynamoDBModeling { 

// class var dynamoDBTableName : String { get { return "" }} 
// class var hashKeyAttribute : String { get { return "" }} 

    class func dynamoDBTableName() -> String! { 
     return "" 
    } 
    class func hashKeyAttribute() -> String! { 
     return "" 
    } 
} 

Bonus Frage: Beim Versuch, das Objective-C-Protokoll beauftragt Klassenvariablen als Swift Klassenvariablen zu implementieren, erhalte ich einen Übersetzungsfehler:

Type DDBItem must conform to protocol 'AWSDynamoDBModeling'

Ausführungs sie als Funktion scheinen akzeptiert zu sein. Warum ?

+0

Für die zweite Frage Eigenschaft ist nur Syntax Zucker, wenn Ich denke, der Compiler hat die Syntaxzuckerkartierung für die OC-Eigenschaft durchgeführt, um sie zu einer Eigenschaft in Swift zu machen.Aber es gibt keine Klassenstufe Eigenschaft in OC und die +() ist eine Methode, die der Compiler ordnet es nur zu einer schnellen Klasse Level-Methode. Es kann nur mit A.classmethod() aufgerufen werden. – Shuo

+0

Für die erste Frage habe ich keine Ahnung, was passiert ist. Auch wenn Sie von MTLModel erben, die direkt von NSObject erben, ist der Fehler weiterhin vorhanden. Das heißt, das tiefe Nest ist nicht das Problem, sondern die MLTModell-Implementierung. – Shuo

+0

Guter Punkt, ich werde MLTModel Implementierung betrachten –

Antwort

10

Selbst beantwortet aus Gründen der Archivierung.

Beim Hinzufügen

override func isEqual(anObject: AnyObject?) -> Bool { 
    return super.isEqual(anObject) 
} 

meiner Klasse, es funktioniert. Diese Methode sollte von der Basisklasse geerbt worden sein.

Sieht aus wie ein Fehler in Swift/Xcode 6.1 mir

+0

Getestet habe ich nur diese wieder mit Xcode 6.3 und Swift 1.2 und dieses Problem behoben ist! –

+5

http://stackoverflow.com/questions/24991018/a-class-how-to-conform-to-protocol-in-swift auf eine andere Antwort Führte mich: meine Klasse benötigt NSObject auf die Vererbungsliste – abelito

+0

vererben hinzufügen NSObject, die eine sauberere Lösung ist –

1

Nur ein Heads für diejenigen auf, die auf diesen Beitrag stolpern. AWSDynamoDBModeling Protokoll wurde im neuesten SDK (v2.1.1) geändert. Erforderliche Funktionen: dynamoDBTableName und hashKeyAttribute müssen statisch sein. Die Dokumentation ab heute (27.05.2015) scheint veraltet zu sein.

Beispiel:

class Dingle:AWSDynamoDBObjectModel, AWSDynamoDBModeling { 

    static func dynamoDBTableName() -> String! { 
     return "dev_coupons" 
    } 

    static func hashKeyAttribute() -> String! { 
     return "status " 
    } 

    func rangeKeyAttribute() -> String! { 
     return "post_date" 
    } 

    override func isEqual(object: AnyObject?) -> Bool { 
     return super.isEqual(object) 
    } 
} 
0

bestätigt! Schreiben Sie die Funktionen auf diese Weise:

static func dynamoDBTableName() -> String { 


    return "pb_Test" 

} 


static func hashKeyAttribute() -> String { 



    return "ID" 
} 

Und Sie müssen hierfür sind:

override func isEqual(anObject: AnyObject?) -> Bool { 
    return super.isEqual(anObject) 
} 
78

erben gerade von NSObject:

class DDBItem : NSObject, AWSDynamoDBModel, AWSDynamoDBModeling { 
+4

das ist die richtige Antwort –

+0

Nein, es ist nicht die richtige Antwort, da AWSDynamoDBModel bereits von NSObject erbt, wie in meiner ursprünglichen Frage "AWSDynamoDBModel hat eine lange Kette der Vererbung, die schließlich mit NSObject beginnt" –

+0

so lange wie die Fehlermeldung geht weg.. – Martian2049

Verwandte Themen