Brandon A
Brandon A

Reputation: 8279

Swift Protocol-Oriented Programming: Can Protocol Extension Property Have Same Name As Base Class Property

Scenario

I am working on an SDK that will be used in two separate projects. Both projects will be using CoreData and the SDK needs to be fed data that is present in both project's managed object model. To do this I am employing a protocol-oriented design to get the SDK the data it needs.


The project will start out with a NSManagedObject base class that contains it's properties...

// Project
class Tag: NSManagedObject { 
var name: String!
var code: String!
var items: [Any]!
...
}

These names are basic and simple. It would be nice to not have to change these when we conform this class to the protocol.


The SDK declares two protocols. The first protocol will be the data source the SDK will need to populate it's views. Some class in the project will conform to this and be the delegate...

// SDK
protocol SDKDataSource {
    func getTaggableObjects() -> [Taggable]
}

var delegate: SDKDataSource!

The second protocol will be the ultimatum the SDK will make to it's project that the NSManagedObject it will be fed should conform to...

// SDK
protocol Taggable {
    var name: String { get }
    var code: String { get }
    var items: [Any] { get }
}

In the project I will create an extension of the class and agree to conform that class to the Taggable protocol...

// Extension (in Project w/ SDK included)
extension Tag: Taggable {

    var name: String {
        get {
            self.name
        }
    }

    var code: String {
        get {
            self.code
        }
    }

    var items: [Any] {
        get {
            self.items
        }
    }
}

This way when the SDK asks it's datasource to getTaggableObjects() the SDK will receive the objects from the Project's CoreData model that it can understand.

Question

Does the name of property in the protocol extension have to be different than the name of the property that is in the base class, or will doing the above work? It would be nice if I knew this is okay before I implement my design.

Upvotes: 1

Views: 1135

Answers (2)

Brandon A
Brandon A

Reputation: 8279

I can confirm that using the same name is not allowed.

enter image description here

Upvotes: 2

Lumialxk
Lumialxk

Reputation: 6379

I tried and it's yes.

protocol MyArray {
    var count: Int {get}
}

extension Array: MyArray {

}

But you can't make different implementations for different protocols that have the same function or property.

Update
If protocol and base class have property with the same name but different type. You can make different implementations.

protocol MyArray {
    var count: Float {get}
}

extension Array: MyArray {
    var count: Float {
        get {
            return 0.0
        }
    }
}

Upvotes: 0

Related Questions