Swift: тип XXX должен соответствовать протоколу 'NSObjectProtocol'
Я пытаюсь реализовать класс Swift, который должен
- наследовать от класса Objective-C
- реализуйте протокол Objective-C с переменной класса.
хотя класс Objective-C, который я подкласс наследует от NSObject, я получаю следующую ошибку компиляции:
Type DDBItem must conform to protocol 'NSObjectProtocol'
класс Objective-C и протокол Objective-C, который я наследую / реализую, доступны по адресу https://github.com/aws/aws-sdk-ios/blob/master/DynamoDB/AWSDynamoDBObjectMapper.h
AWSDynamoDBModel имеет длинную цепочку наследования, которая в конечном итоге начинается с NSObject AWSDynamoDBModeling применяет две переменные класса.
мой код
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 ""
}
}
бонусный вопрос : при попытке реализовать переменные класса протокола Objective-C как переменные класса Swift, я получаю ошибку компиляции :
Type DDBItem must conform to protocol 'AWSDynamoDBModeling'
реализация их в качестве функции, похоже, принимается. Почему ?
4 ответов
Self ответил для архивирования.
при добавлении
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
}
для моего класса это работает. Этот метод должен быть унаследован от базового класса.
похоже на ошибку в Swift / Xcode 6.1 для меня
просто головы для тех, кто натыкается на этот пост. AWSDynamoDBModeling
протокол был изменен в последнем SDK (v2.1.1). Необходимые функции:
dynamoDBTableName
и hashKeyAttribute
должен быть статическим. Документации по состоянию на сегодня (5/27/2015) представляется устаревшим.
пример:
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)
}
}
подтвердили! Напишите функции таким образом:
static func dynamoDBTableName() -> String {
return "pb_Test"
}
static func hashKeyAttribute() -> String {
return "ID"
}
и вы должны включить следующее:
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
}