I assume when we get existentials, your problem could be solved like this:
protocol P {}
class X: P {}
func foo<A:P>(_ x:A) {}
func bar() {
let x = X() as Any<P>
foo(x)
}
Here A will be Any<P> which conforms to P and makes the compiler happy.
let c: P = … here is P and existential like (future) Any<P>.
x as P here is P used as a type.
It’s weird that the latter is a type but the first example is an existential. I
think this is a design choice, because we almost never need the protocol as a
type.
--
Adrian Zubarev
Sent with Airmail
Am 23. Dezember 2016 um 09:57:49, Adrian Zubarev
([email protected]) schrieb:
What are you trying to solve here?
Do you heavily rely on what A can be?
Can’t you just write func foo(_ x: P) {} (here P is an existential like [in
some future] Any<P>)?!
AnyObject is for classes, but you’d get the same result changing X to a class ;)
If you want scratch the surface of what happens to protocols in a generic
context, you could read our proposal about meta types here.
--
Adrian Zubarev
Sent with Airmail
Am 23. Dezember 2016 um 09:43:34, Mikhail Seriukov via swift-users
([email protected]) schrieb:
No it does not.
You have made a type out of the parameter. It’s no longer a protocol.
IMO the failure here is to understand the difference between a type and a
protocol.
A type (even if empty) is always a combination of storage with functions (that
are assumed to work on the data in storage)
A protocol is just a definition of functions without the accompanying data.
I see your point.
But actually when I write it as `let x = X() as P` I really mean that I want
`x` to be `AnyObject` but conforming to P, not just protocol itself.
Is it even possible to downcast it this way?
2016-12-23 14:51 GMT+07:00 Marinus van der Lugt <[email protected]>:
On 22 Dec 2016, at 22:43, Howard Lovatt <[email protected]> wrote:
The following variation works:
protocol P {}
class P1:P {}
class X:P1 {}
func foo<A:P>(_ x:A) {}
func bar() {
//let x = X() // this compiles
let x = X() as P1 // this does not compile. Why?
foo(x)
}
Which adds credence to the bug theory.
No it does not.
You have made a type out of the parameter. It’s no longer a protocol.
IMO the failure here is to understand the difference between a type and a
protocol.
A type (even if empty) is always a combination of storage with functions (that
are assumed to work on the data in storage)
A protocol is just a definition of functions without the accompanying data.
Rien.
Note two changes: 1. two levels of inheritance and 2. change to classes. If you
do two levels using protocols it doesn't work if you use either classes or
structs.
-- Howard.
On 23 December 2016 at 07:29, Kevin Nattinger <[email protected]> wrote:
I recall seeing a request on the -evolution list for something like `T := X` to
indicate it could be X itself or anything inheriting / implementing it, so it’s
certainly known behavior, if not desired. IMO it’s a bug and `:` should be
fixed to include the root type, whether or not that requires a discussion on
-evolution.
On Dec 22, 2016, at 2:17 PM, Howard Lovatt via swift-users
<[email protected]> wrote:
I suspect a compiler bug since A is a P. The equivalent in Java works:
interface P {}
class X implements P {}
<A extends P> void foo(A x) {}
void bar() {
final P x = new X();
foo(x);
}
-- Howard.
On 23 Dec 2016, at 3:19 am, Rien via swift-users <[email protected]> wrote:
IMO the error message says it all:
Playground execution failed: error: MyPlayground8.playground:9:5: error: cannot
invoke 'foo' with an argument list of type '(P)'
foo(x)
^
MyPlayground8.playground:9:5: note: expected an argument list of type '(A)'
foo(x)
^
I.e. you are passing in a protocol while the function is specified for a type.
Said other way: On which data do you expect the protocol to operate?
Regards,
Rien
Site: http://balancingrock.nl
Blog: http://swiftrien.blogspot.com
Github: http://github.com/Swiftrien
Project: http://swiftfire.nl
On 22 Dec 2016, at 17:05, Mikhail Seriukov via swift-users
<[email protected]> wrote:
Hello community! I' wondering if somebody can explain this to me.
Please take look at the snippet.
protocol P {}
struct X:P {}
func foo<A:P>(_ x:A) {}
func bar() {
//let x = X() // this compiles
let x = X() as P // this does not compile. Why?
foo(x)
}
I expect the both cases to work though. But only first works? And I do not
understand why.
My coworkers said that it is a compiler bug, but I'm not shure it is.
Thanks for the help.
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users