Reputation: 14905
I am trying to implement a Swift class that must
Although the Objective-C class I am subclassing is inheriting from NSObject, I receive the following compilation error :
Type DDBItem must conform to protocol 'NSObjectProtocol'
The Objective-C class and Objective-C protocol I am inheriting / implementing are available at https://github.com/aws/aws-sdk-ios/blob/master/DynamoDB/AWSDynamoDBObjectMapper.h
AWSDynamoDBModel has a long chain of inheritance that eventually starts with NSObject AWSDynamoDBModeling is enforcing two class variables.
My code is
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 ""
}
}
Bonus Question : when trying to implement the Objective-C protocol mandated class variables as Swift class variables, I receive a compilation error :
Type DDBItem must conform to protocol 'AWSDynamoDBModeling'
Implementing them as function seems to be accepted. Why ?
Upvotes: 33
Views: 22595
Reputation: 19664
Just a heads up for those that stumble upon this post. AWSDynamoDBModeling
protocol has been changed in the latest SDK (v2.1.1). Required functions:
dynamoDBTableName
and hashKeyAttribute
must be static. The documentation as of today (5/27/2015) appears to be out of date.
Example:
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)
}
}
Upvotes: 1
Reputation: 15449
Just inherit from NSObject:
class DDBItem : NSObject, AWSDynamoDBModel, AWSDynamoDBModeling {
Upvotes: 79
Reputation: 5634
Confirmed! Write the functions this way:
static func dynamoDBTableName() -> String {
return "pb_Test"
}
static func hashKeyAttribute() -> String {
return "ID"
}
And you have to include this:
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
}
Upvotes: 0
Reputation: 14905
Self answered for sake of archiving.
When adding
override func isEqual(anObject: AnyObject?) -> Bool {
return super.isEqual(anObject)
}
to my class, it works. This method should have been inherited from the base class.
Looks like a bug in Swift / Xcode 6.1 to me
Upvotes: 10