Sébastien Stormacq
Sébastien Stormacq

Reputation: 14905

Swift : Type XXX must conform to protocol 'NSObjectProtocol'

I am trying to implement a Swift class that must

  1. Inherit from an Objective-C class
  2. Implement a Objective-C protocol with class variable.

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

Answers (4)

Nick
Nick

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

Johnny Z
Johnny Z

Reputation: 15449

Just inherit from NSObject:

class DDBItem : NSObject, AWSDynamoDBModel, AWSDynamoDBModeling {

Upvotes: 79

Jon Vogel
Jon Vogel

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

Sébastien Stormacq
Sébastien Stormacq

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

Related Questions