Re: [swift-users] How do you use protocol types?

2016-07-13 Thread Dan Loewenherz via swift-users
Unless you need to abstract what the Factory class does, I would eliminate
AProto.

class Factory {

func constructInstance(_ t: T.Type) -> T
{

return t.init()

}

}


If you truly want to genericize Factory, you can do the following:


class Factory: AProto {

typealias ElementType = T


func constructInstance(_ t: T.Type) -> T {

return t.init()

}

}


However, ElementType can be inferred, so you can zap it, and then you get
this:


class Factory: AProto {

func constructInstance(_ t: T.Type) -> T {

return t.init()

}

}


…which compiles and I think does what you want it to. :)


Dan

On Wed, Jul 13, 2016 at 8:58 PM, Karl via swift-users  wrote:

> So I’m trying to work generically to construct things based on their
> conformance to a protocol with an initialiser. I’m sure this worked before;
> I’ve done it before. Maybe there have been some changes in the language or
> something, because I’ve tried everywhich-way and this just isn’t flying:
>
> ==
> protocol AProto {
>
> associatedtype ElementType
> func constructInstance(_: ElementType.Type) -> ElementType
> }
>
> protocol SimpleConstructableElement {
> init()
> }
>
> extension Int : SimpleConstructableElement {}
>
> class Factory : AProto {
>
> typealias ElementType = SimpleConstructableElement
>
> func constructInstance(_ t: SimpleConstructableElement.Type) ->
> SimpleConstructableElement {
> return t.init()
> }
> }
>
> Factory().constructInstance(Int.self)
> =
>
> /tmp/MyPlayground.playground:15:7: Type 'Factory' does not conform to
> protocol 'AProto'
> /tmp/MyPlayground.playground:6:7: Protocol requires function
> 'constructInstance' with type '(ElementType.Protocol) -> ElementType'
> /tmp/MyPlayground.playground:19:7: Candidate has non-matching type
> '(SimpleConstructableElement.Type) -> SimpleConstructableElement’
>
> =
>
>
> The thing that gets me about this is that Xcode’s code-completion tells me
> that SimpleConstructableElement.Type is of type
> SimpleConstructableElement.Protocol, so it should be the same as
> ElementType.Protocol and should be accepted, right?
>
> Karl
> ___
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
___
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


[swift-users] How do you use protocol types?

2016-07-13 Thread Karl via swift-users
So I’m trying to work generically to construct things based on their 
conformance to a protocol with an initialiser. I’m sure this worked before; 
I’ve done it before. Maybe there have been some changes in the language or 
something, because I’ve tried everywhich-way and this just isn’t flying:

==
protocol AProto {

associatedtype ElementType
func constructInstance(_: ElementType.Type) -> ElementType
}

protocol SimpleConstructableElement {
init()
}

extension Int : SimpleConstructableElement {}

class Factory : AProto {

typealias ElementType = SimpleConstructableElement

func constructInstance(_ t: SimpleConstructableElement.Type) -> 
SimpleConstructableElement {
return t.init()
}
}

Factory().constructInstance(Int.self)
=

/tmp/MyPlayground.playground:15:7: Type 'Factory' does not conform to protocol 
'AProto'
/tmp/MyPlayground.playground:6:7: Protocol requires function 
'constructInstance' with type '(ElementType.Protocol) -> ElementType'
/tmp/MyPlayground.playground:19:7: Candidate has non-matching type 
'(SimpleConstructableElement.Type) -> SimpleConstructableElement’

=


The thing that gets me about this is that Xcode’s code-completion tells me that 
SimpleConstructableElement.Type is of type SimpleConstructableElement.Protocol, 
so it should be the same as ElementType.Protocol and should be accepted, right?

Karl
___
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users