ios - Swift: el tipo XXX debe cumplir con el protocolo ''NSObjectProtocol''
objective-c amazon-dynamodb (4)
Estoy tratando de implementar una clase Swift que debe
- Heredar de una clase de Objective-C
- Implementar un protocolo Objective-C con variable de clase.
Aunque la clase Objective-C que estoy subclasificando está heredando de NSObject, recibo el siguiente error de compilación:
Type DDBItem must conform to protocol ''NSObjectProtocol''
La clase de Objective-C y el protocolo de Objective-C que estoy heredando / implementando están disponibles en https://github.com/aws/aws-sdk-ios/blob/master/DynamoDB/AWSDynamoDBObjectMapper.h
AWSDynamoDBModel tiene una larga cadena de herencia que eventualmente comienza con NSObject. AWSDynamoDBModeling aplica dos variables de clase.
Mi codigo es
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 ""
}
}
Pregunta extra: cuando intento implementar las variables de clase obligatorias del protocolo Objective-C como variables de clase Swift, recibo un error de compilación:
Type DDBItem must conform to protocol ''AWSDynamoDBModeling''
Su implementación como función parece ser aceptada. Por qué ?
¡Confirmado! Escribe las funciones de esta manera:
static func dynamoDBTableName() -> String {
return "pb_Test"
}
static func hashKeyAttribute() -> String {
return "ID"
}
Y tienes que incluir esto:
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
}
Auto respondido por el bien del archivo.
Al agregar
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
}
a mi clase, funciona Este método debería haber sido heredado de la clase base.
A mi me parece un error en Swift / Xcode 6.1
Solo hereda de NSObject:
class DDBItem : NSObject, AWSDynamoDBModel, AWSDynamoDBModeling {
Solo un aviso para aquellos que se topan con este post. AWSDynamoDBModeling
protocolo AWSDynamoDBModeling
se ha modificado en el último SDK (v2.1.1). Funciones requeridas: dynamoDBTableName
y hashKeyAttribute
deben ser estáticos. La documentación de hoy (27/05/2015) parece estar desactualizada.
Ejemplo:
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)
}
}