Hi Swift users,

I’m defining a sub-protocol inheriting from parent protocol with 
associatedtype, and I want to specialized the associatedtype to certain 
concrete type.

For example, 

```swift
protocol Foo {
    associatedtype Bar
    
    static var bar: Bar { get }
}
    
protocol A: Foo {
    // I want `Bar` to be `Int`.
    static var a: Int { get }
    static var bar: Int { get }
}

extension A {
    typealias Bar = Int
}
```

I want any class/struct adopting protocol `A` having associatedtype `Bar` 
specialized to Int. However, I found that structs adopting `A` are still 
capable of override it.

```swift
extension A {
    static var bar: Int {
        return a
    }

    static func test() {
        print(bar)
    }
}

struct AStruct: A {
    static let a: Int = 0
    static let bar: Bool = false // Bar is now Bool
    // static let bar: Int now becomes invisible.
}

AStruct.test() // prints 0
```

The code above gave same result on both Swift 2.2(Xcode 7.3.1) and Swift 
3.0(Xcode 8 beta 3).

It’s this expected behavior? Or am I'm getting something wrong here? What about 
specializing parent’s associatedtype to certain generic type with newly 
introduced associatedtype? For example,

```swift
protocol B: Foo {
    associatedtype T
    static var bar: Array<T> { get }
}

extension B {
    typealias Bar = Array<T>
}
```

Any idea would be appreciated.

Thanks

Fengwei
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to