繁体   English   中英

Swift 2.0:不能将泛型作为参数传递

[英]Swift 2.0: can not pass generic as a parameter

为什么这不起作用(即使Container符合Unique协议。)以及最好的解决方法是什么样的?

protocol Unique {
    var uniqueId: String {get}
}

struct Container <T>: Unique {
    typealias UnderlyingObject = T
    var object: UnderlyingObject
    var uniqueId: String
}

func myFunc(protocolClosure: (Unique, Unique) -> Unique) {
    print("...")
}

func problemStartsHere<T,S,U>(paramClosure: (Container<T>, Container<S>) -> Container<U>) {
    myFunc(paramClosure)
}

在此输入图像描述

这里的问题是方差之一,尽管不是你正在寻找的方差。 因为你传递了一个闭包,所以你真的试图使方法签名本身匹配,而不是传递给方法本身或从方法返回的值。 如果,例如, myFunc尝试使用Container<T>以外的类型的参数调用闭包,并且因为它期望任何Unique对于该调用是可接受的,那么这可能会引发问题,它会编译得很好。

编译器显示此警告的原因是: myFunc期望一个闭包适用于任何类型的Unique而不仅仅是Container<T>

您应该使用该函数的通用版本:

func myFunc<A: Unique, B: Unique, C: Unique>(protocolClosure: (A, B) -> C) {
    print("...")
}

编辑:假设您想调用您的函数问题problemStartsHere如下:

problemStartsHere { (c1: Container<Int>, c2: Container<Int>) -> Container<Int> in
    print(c1.object, c2.object)
    return c1
}

请注意,该函数使用Container -specific属性object 不是编译器应该如何创建一个适用于任何Unique的闭包? 它不能像这样工作,因为它没有意义,这样的功能不能在任何Unique上工作。

问题是返回值。 虽然您可以将任何Container<...>传递给Unique参数,但Unique类型的返回值无法强制转换为Container<...> 这就是封闭类型(Container<...>, Container<...>) -> Container<...>无法转换为(Unique, Unique) -> Unique

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM