web-dev-qa-db-ja.com

Swift:タイプXXXはプロトコル 'NSObjectProtocol'に準拠する必要があります

Swiftクラスを実装しようとしています

  1. Objective-Cクラスから継承する
  2. クラス変数を使用して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は2つのクラス変数を適用しています。

私のコードは

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'

関数として実装することは受け入れられているようです。どうして ?

31

アーカイブのために自己回答。

追加するとき

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

私のクラスにとっては、うまくいきます。このメソッドは、基本クラスから継承されている必要があります。

Swift/Xcode 6.1のバグのように見えます

10

NSObjectから継承するだけです:

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

この投稿につまずく人のために。 AWSDynamoDBModelingプロトコルは、最新のSDK(v2.1.1)で変更されました。必要な関数:dynamoDBTableNameおよびhashKeyAttributeは静的である必要があります。今日(2015年5月27日)のドキュメントは古くなっているようです。

例:

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

確認済み!この方法で関数を記述します。

static func dynamoDBTableName() -> String {


    return "pb_Test"

}


static func hashKeyAttribute() -> String {



    return "ID"
}

そして、あなたはこれを含まなければなりません:

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