[swift-evolution] Proposal: CustomConvertible protocol

Stepan Hruda stepan.hruda at gmail.com
Fri Dec 4 08:15:57 CST 2015


This is not how *LiteralConvertible protocols work, though. You can only initialize variables with specific literal values recognized by the parser, it never magically casts a type to a different type for you. Similar implicit casts in my opinion confuse whoever reads the code afterwards.




```


class SomeConvertible: BooleanLiteralConvertible {

    typealias BooleanLiteralType = Bool

    let boolean: Bool




    internal required init(booleanLiteral value: SomeConvertible.BooleanLiteralType) {

        self.boolean = value

    }

}




func getBoolean() -> Bool {

    return false

}




let validConvertible: SomeConvertible = false

// Line below doesn’t compile

let invalidConvertible: SomeConvertible = getBoolean()



```

On Fri, Dec 4, 2015 at 8:51 AM, Adrian Zubarev
<adrian.zubarev at devandartist.com> wrote:

> We have finally a corner where people can share their ideas on how Swift can be improved, and I’m glad my ideas might be part of this fun.
> Swift introduced a few Convertible protocols, but it still needs some more If you ask me.
> Something like this:
> public protocol CustomConvertible {
>      
>     typealias CustomType
>      
>     public init(value: Self.CustomType) // or in a better way I can't come up with
> }
> But it should work in a way that we could create more different types like enums and ErrorType.
> protocol AConvertible: CustomConvertible { /* some stuff here*/ }
> protocol BConvertible: CustomConvertible { /* some stuff here*/ }
> struct A {
>     var foo: Int = 0
> }
> struct B {
>     var boo: String = "Hello World"
> }
> struct C: AConvertible, BConvertible {
>      
>     typealias CustomAType = A
>     typealias CustomBType = B
>      
>     var magical: SomeType
>          
>     init(value: CustomAType) {
>         // implement it
>     }
>      
>     init(value: CustomBType) {
>         // implement it
>     }
> }
> //===========================
> let firstC: C = A() // this is what I'm missing in Swift
> let secondC: C = B() // this would be a great syntax sugar
> What do you think?
> — 
> Regards Adrian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151204/0fbd63a3/attachment.html>


More information about the swift-evolution mailing list