5

I've written a struct that holds basic Asset data:

struct Asset: AssetProtocol {

    init (id: Int = 0, url: String) {
        self.id = id
        self.url = URL(string: url)
    }

    var id: Int 
    var url: URL?

}

It subscribes to AssetProtocol

protocol AssetProtocol {
    var id: Int { get }
    var url: URL? { get }
}

I'm hoping to extend the Array (Sequence) where the elements in that Array are items that subscribe to the AssetProtocol. Also, for these functions to be able to mutate the Array in place.

extension Sequence where Iterator.Element: AssetProtocol {

    mutating func appendUpdateExclusive(element newAsset: Asset) {    
        ...

How can I iterate through and mutate this sequence? I've tried half a dozen ways and can't seem to get it right!

1 Answer 1

6

Rather than using a method which takes an Asset as an argument, consider reusing Element instead. Since you've already defined the constraint on Element in your extension definition, all methods and properties on AssetProtocol will be available on the instance of Element:

protocol AssetProtocol {
    var id: Int { get }
    var url: URL? { get }

    static func someStaticMethod()
    func someInstanceMethod()
}

extension Array where Element:AssetProtocol {
    mutating func appendUpdateExclusive(element newAsset: Element) {
        newAsset.someInstanceMethod()
        Element.someStaticMethod()

        append(newAsset)
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

I think the key here is declaring the function parameter to be : Element. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.