Swift 泛型函数调用另一个泛型函数

标签: ios Swift
发布时间: 2017/3/6 23:04:59
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用的 Swift 2.2 XCode 7.3.1 和试图调用 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)''

解决方法 1:

问题是,抽象类型 Swift 不一定符合自己— — 因此不能使用 SomeProtocol 类型化的事情,是混凝土类型符合 SomeProtocol (这是什么你 add1 泛型函数期望作为参数)。

因此最简单的解决方案,你的情况是只是为了使用泛型 variable 参数,而不是 variable 属性,因为它是泛型,它是键入作为一个实际的东西,符合 SomeProtocol ,,因此会转嫁到你 add1 函数︰

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

然而为了防止这种问题以后下线,你可能想要考虑您的类的泛型,假设你 variable 属性应该是常量类型的整个生存期中的给定 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 数组中的类型):

class Thing1 {

    let variable: SomeProtocol

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

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

class Thing2 {
    func add2(stuff: SomeProtocol) {

    }
}

虽然你总是应该知道一起使用抽象类型,看到更多的信息这个伟大 WWDC 演讲的额外费用。

官方微信
官方QQ群
31647020