[swift-users] Generic initializer's parameter type not being resolved
Hooman Mehr
hooman at mac.com
Tue Jan 31 15:27:38 CST 2017
Update your where clause to:
where Type: PluginDataProtocol, Type.Parent == Monster {
> On Jan 31, 2017, at 10:36 AM, Andrey Fidrya via swift-users <swift-users at swift.org> wrote:
>
> Hi All,
>
> I've encountered a very strange problem where generic initializer's parameter type isn't resolved correctly unless explicitly casted.
>
> Below is playground code for reproducing the problem and compiler error I'm getting.
> After removing "as! Type.Parent" cast the code won't compile anymore...
>
> It expects Type.Parent and I'm passing Monster, but Parent is typealiased to Monster.
> Why can't it infer the type automatically?
>
>
> public protocol PluginDataProtocol: class {
> associatedtype Parent
> init(parent: Parent)
> }
>
> public class Monster {
> public var pluginsData = [ObjectIdentifier: AnyObject]()
>
> public func pluginData<Type>(id: ObjectIdentifier = ObjectIdentifier(Type.self)) -> Type
> where Type: PluginDataProtocol {
> if let data = pluginsData[id] as? Type {
> return data
> } else {
> let data = Type(parent: self as! Type.Parent)
> pluginsData[id] = data
> return data
> }
> }
> }
>
> final class MyMonsterPluginData: PluginDataProtocol {
> typealias Parent = Monster
>
> weak var parent: Parent?
>
> init(parent: Parent) {
> self.parent = parent
> }
> }
>
> Compiler error:
>
> Playground execution failed: error: Generics.playground:14:24: error: cannot invoke initializer for type 'Type' with an argument list of type '(parent: Monster)'
> let data = Type(parent: self /* as! Type.Parent */)
> ^
>
> Generics.playground:14:24: note: expected an argument list of type '(parent: Self.Parent)'
> let data = Type(parent: self /* as! Type.Parent */)
>
>
> Regards,
> Andrey
>
>
>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170131/7ffff02a/attachment.html>
More information about the swift-users
mailing list