web-dev-qa-db-fra.com

Swift: le type XXX doit être conforme au protocole 'NSObjectProtocol'

J'essaie de mettre en place une classe Swift qui doit 

  1. Hériter d'une classe Objective-C
  2. Implémentez un protocole Objective-C avec une variable de classe.

Bien que la classe Objective-C que je sous-classe hérite de NSObject, le message d'erreur de compilation suivant s'affiche:

Type DDBItem must conform to protocol 'NSObjectProtocol'

La classe Objective-C et le protocole Objective-C dont je hérite/est mis en oeuvre sont disponibles à l'adresse https://github.com/aws/aws-sdk-ios/blob/master/DynamoDB/AWSDynamoDBObjectMapper.h

AWSDynamoDBModel a une longue chaîne d'héritage qui commence par NSObject AWSDynamoDBModeling applique deux variables de classe.

Mon code est 

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

Question supplémentaire: lorsque je tente d'implémenter les variables de classe mandatées par le protocole Objective-C en tant que variables de classe Swift, je reçois une erreur de compilation:

Type DDBItem must conform to protocol 'AWSDynamoDBModeling'

Leur mise en œuvre en tant que fonction semble être acceptée. Pourquoi ?

31

Auto répondu pour des raisons d'archivage.

Lors de l'ajout

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

pour ma classe, ça marche . Cette méthode aurait dû être héritée de la classe de base.

Ça ressemble à un bug dans Swift/Xcode 6.1 

10

Juste hériter de NSObject:

class DDBItem : NSObject, AWSDynamoDBModel, AWSDynamoDBModeling {
78
Johnny Z

Juste un avertissement pour ceux qui tombent sur ce post. Le protocole AWSDynamoDBModeling a été modifié dans le dernier SDK (v2.1.1). Fonctions requises: dynamoDBTableName et hashKeyAttribute doivent être statiques. La documentation mise à jour aujourd'hui (27/05/2015) semble être périmée.

Exemple:

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)
    }
}
1
Nick

Confirmé! Écrivez les fonctions de cette façon:

static func dynamoDBTableName() -> String {


    return "pb_Test"

}


static func hashKeyAttribute() -> String {



    return "ID"
}

Et vous devez inclure ceci:

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