Подтвердить что ты не робот

Swift: Тип XXX должен соответствовать протоколу 'NSObjectProtocol'

Я пытаюсь реализовать класс Swift, который должен

  • Наследовать от класса Objective-C
  • Внедрить протокол Objective-C с переменной класса.

Хотя класс Objective-C class я является подклассом, наследуется от 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'

Реализация их как функции, по-видимому, принимается. Почему?

4b9b3361

Ответ 1

Самостоятельно ответил ради архивирования.

При добавлении

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

для моего класса, он работает. Этот метод должен быть унаследован от базового класса.

Похож на ошибку в Swift/Xcode 6.1 для меня

Ответ 2

Просто наследуйте от NSObject:

class DDBItem : NSObject, AWSDynamoDBModel, AWSDynamoDBModeling {

Ответ 3

Просто голова для тех, кто наткнется на этот пост. Протокол 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)
    }
}

Ответ 4

Подтверждено! Напишите функции таким образом:

static func dynamoDBTableName() -> String {


    return "pb_Test"

}


static func hashKeyAttribute() -> String {



    return "ID"
}

И вы должны включить это:

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