Swiftクラスを実装しようとしています
サブクラス化する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'
関数として実装することは受け入れられているようです。どうして ?
アーカイブのために自己回答。
追加するとき
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
}
私のクラスにとっては、うまくいきます。このメソッドは、基本クラスから継承されている必要があります。
Swift/Xcode 6.1のバグのように見えます
NSObjectから継承するだけです:
class DDBItem : NSObject, AWSDynamoDBModel, AWSDynamoDBModeling {
この投稿につまずく人のために。 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)
}
}
確認済み!この方法で関数を記述します。
static func dynamoDBTableName() -> String {
return "pb_Test"
}
static func hashKeyAttribute() -> String {
return "ID"
}
そして、あなたはこれを含まなければなりません:
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
}