[swift-evolution] [Pre-Proposal-Discussion] Union Type - Swift 4

Cao, Jiannan frogcjn at 163.com
Wed Aug 10 21:58:58 CDT 2016


It is no a mistake. since fn1: (A|B)->Void is subtype of fn0: A->Void 


Detail explain:


var fn0: A->Void = {print($0)} 
var fn1: (A|B)->Void = {print(v0)} 
let a = A()
let b = B()


So:


fn0( a ) // this is OK 
fn1( a ) // this is also OK


fn1 is subtype of fn0, because fn1 can do anything fn0 do.
Thus fn0 = fn1 is OK.


But:


fn1( b ) // this is OK
fn0( b ) // this is not OK


So fn0 is not subtype of fn1


At 2016-08-11 10:41:02, "Step C" <schristopher at bignerdranch.com> wrote:

Shouldn't it be "fn1 = fn0"? Same for the fn2 statements. 


`var fn0: A->Void= {print(v0)} 
var fn1: (A|B)->Void= {print(v0)} 


 fn0 = fn1 // OK, because Original Type and Union Type has a sub-typing relationshipvar 


fn2: (A|B|C)->Void= {print($0)} 


 fn0 = fn2 // OK 
 fn1 = fn2 // OK`

On Aug 10, 2016, at 9:28 PM, Cao Jiannan via swift-evolution <swift-evolution at swift.org> wrote:


Hi all,


I want to make a discussion about union type for swift 4.
See https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md



Add union type grammar, represents the type which is one of other types.

var stringOrURL: String| URL ="https://www.apple.com"

Now, if we using the new union type feature, we can declare type conveniently, No other type declaration, and compiler will automatically calculate the common interface.

funcinput(value: A | B | C) {
    print(value.commonProperty) // type checker will calculate the common interface, developer just use it out of boxswitch value {
    caselet value as A:
        // value is type Aprint(value.propertyInA)
    caselet value as B:
        // value is type Bprint(value.propertyInB)
    caselet value as C:
        // value is type Cprint(value.propertyInC)
    }
    // there is no default case other than A, B or C. we already declared that.
}

Note: A, B, C can be either class or protocol, or any other types. This leaves developer more freedom.



Impact on existing code
This is a new feature, developer who need declare common type will alter to this new grammar.
Enum based version optional or IUO will be replaced by Union-based ones. Any optional type will automatically replaced by union type


_______________________________________________
swift-evolution mailing list
swift-evolution at swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution





 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160811/1db27090/attachment.html>


More information about the swift-evolution mailing list