我在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)''
答案 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