So as the *foo(_ x:A) *function is generic, when we call *foo(x) *compiler
needs to determine what type is *A *to be able to create concrete function.
But x defined as *let x = X() as P *so we only know about it that it
conforms to *P *but not its real type to put instead of *A*. Right?
But where
> On 30 Dec 2016, at 12:14, Mikhail Seriukov via swift-users
> wrote:
>
> Ok,
> But I think I still do not get it.
> What does really happen when we write this?
>> let x = X() as P
>>
'X()' creates a value.
'as P’ constrains the value such that the only things we know
Ok,
But I think I still do not get it.
What does really happen when we write this?
let x = X() as P
As I said, I expect x to be Any after that. If it is, then it should be
ok IMO.
But if it is not then what is the actual type of x?
So the real question is how the type checker works here?
> On Dec 22, 2016, at 4:43 PM, Howard Lovatt via swift-users
> wrote:
>
> The following variation works:
>
> protocol P {}
>
> class P1:P {}
>
> class X:P1 {}
>
> func foo(_ x:A) {}
>
> func bar() {
> //let x = X() // this compiles
> let x = X() as P1 //
My previous theory was wrong.
> P is an existential for x: P = … where it is upgraded to the static P in foo
Why it needs to be upgraded? Why not just use `P` as a protocol instead of
a `type`? Xcode error message calls `P` as a type.
Zhaoxin
On Fri, Dec 23, 2016 at 9:03 PM, Adrian Zubarev <
I’m not sure what you mean. P is an existential for x: P = … where it is
upgraded to the static P in foo, but the static P does not conform to
the existential P, which results in an error described by the OP.
x: P = … here it’s Any any type that conforms to P. Any is a type of it’s
own, and
I assume when we get existentials, your problem could be solved like this:
protocol P {}
class X: P {}
func foo(_ x:A) {}
func bar() {
let x = X() as Any
foo(x)
}
Here A will be Any which conforms to P and makes the compiler happy.
let c: P = … here is P and existential like (future)
> On 23 Dec 2016, at 09:43, Mikhail Seriukov wrote:
>
> 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
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)?!
AnyObject is for classes, but you’d get the same result changing X to a class ;)
If you want scratch the surface of what
>
> 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
The function foo(x: A){} requires a type which conforms to protocol P.
An existential of protocol P does not actually conform to protocol P.
It’s always been a limitation in Swift: https://bugs.swift.org/browse/SR-55
If the function’s signature were foo(x: P){}, it would work.
Howard’s example
The following variation works:
protocol P {}
class P1:P {}
class X:P1 {}
func foo(_ 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.
Note two changes: 1. two levels of
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
13 matches
Mail list logo