Swift Generic函数调用另一个Generic函数

时间:2016-08-11 14:49:45

标签: ios swift generics

我在XCode 7.3.1上使用Swift 2.2并尝试从另一个Generic函数调用Generic函数。

代码

class Thing1 {
     let variable: SomeProtocol
     init<A: SomeProtocol>(variable: A) {
          self.variable = variable
          self.add1(self.variable)
     }

     func add1<A: SomeProtocol>(stuff: A) {
          let thing: Thing2 = Thing2()
          thing.add2(stuff)
     }

}

class Thing2 {
    func add2<A: SomeProtocol>(stuff: A) {

    }
}

protocol SomeProtocol { }


add1("a") // Cannot invoke 'add1' with an argument list of type '(String)'
add1(4) // Cannot invoke 'add1' with an argument list of type '(Int)'

我收到了错误。

'Cannot invoke add with an argument of list type '(Whatever type I used to call the function)''

2 个答案:

答案 0 :(得分:2)

问题是abstract types in Swift don't necessarily conform to themselves - 因此你不能使用SomeProtocol类型的东西作为符合SomeProtocol的具体类型的东西(这是你的add1泛型函数期待作为一个论点。)

因此,在您的情况下,最简单的解决方案就是使用通用的variable参数,而不是variable属性,因为它是通用的,它被键入为{a}符合SomeProtocol的具体内容,因此可以传递到add1函数中:

init<A: SomeProtocol>(variable: A) {
    self.variable = variable
    add1(variable)
}

但是,为了防止以后出现这类问题,您可能需要考虑使您的类具有通用性,假设您的variable属性在给定{{1}的整个生命周期内都应该是常量类型实例:

Thing1

或者,您可以重构代码以使用抽象类型class Thing1<A:SomeProtocol> { let variable: A init(variable: A) { self.variable = variable add1(variable) } func add1(stuff: A) { let thing = Thing2() thing.add2(stuff) } } ,这将允许您使用符合SomeProtocol任何类型(例如,允许您在数组中混合使用不同SomeProtocol类型的不同Thing1个实例):

variable

虽然您应该始终了解使用抽象类型所带来的额外成本,see this great WWDC talk for more info

答案 1 :(得分:0)

将扩展程序添加到$(function () { $('#container').highcharts({ series: [{ data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4] }] }); // the button action var i = 0; $('#button').click(function () { var chart = $('#container').highcharts(); chart.series[0].addPoint({ x: 2*i, // or some other value y: 50 * (i % 3) }); i += 1; }); String以及构建Int个对象可以使其正常工作:

Thing1