[swift-users] Protocol doesn't conform to itself: Any workaround?

Charles Srstka cocoadev at charlessoft.com
Mon May 30 18:21:07 CDT 2016


So, the pitfall below seems to be fairly well-known, as I was able to find previous references to it on the list:

--

protocol P { func foo() }
struct S: P { func foo() { print("foo") } }

func doSomething<C: CollectionType where C.Generator.Element: P>(c: C) {
	for each in c {
		each.foo()
	}
}

let arr: [P] = [S()]

doSomething(arr) // error: cannot invoke 'doSomething' with an argument list of type '([P])’

--

And, of course, if we go the opposite way:

--

protocol P { func foo() }
struct S: P { func foo() { print("foo") } }

func doSomething<C: CollectionType where C.Generator.Element == P>(c: C) {
	for each in c {
		each.foo()
	}
}

let arr = [S()]

doSomething(arr) // error: cannot invoke 'doSomething' with an argument list of type '([S])’

--

My questions are twofold.

1. Is there any workaround to this issue that would let one declare a function that can take a collection whose element is anything that conforms to P, whether that be statically typed as P or its actual type, without either writing two versions of every API that takes a collection (and four versions of every API that takes two collections, eight versions of every API that takes three, etc.) or just giving up and accepting an array instead of a collection?

2. Are there any plans by the development team to address this issue?

Thanks,
Charles



More information about the swift-users mailing list