ios - 在 Swift 中使用泛型进行类型推断

标签 ios swift ios8

我有这个代码

func getMeGoodies<T>(String:goodieName, callback:(goodie:T) -> ()) {
   var goodie:T = //get it from the jug
   callback(goodie)
}

在某个地方我想调用它

self.getMeGoodies("chocolatechip", callback: { (goodie) -> () in
            println("eat the \(goodie)")
        })

我在字符串“chocolatechip”处收到一条错误消息,说它无法转换(blah blah)。我相信它无法弄清楚 T 是什么,因为当我从函数返回 goodie 并在调用它时将其分配给变量时它起作用(或者只是做类型转换)

var chocolateChip:Goodie =  self.getMeGoodies("chocolatechip", callback: { (goodie) -> () in
            println("eat the \(goodie)")
        }) 

self.getMeGoodies("chocolatechip", callback: { (goodie) -> () in
            println("eat the \(goodie)")
        }) as Goodie

有什么方法可以让 swift 知道它是什么类型,而无需采用那种笨拙的方式。

最佳答案

如果你给闭包参数添加一个类型注解那么 编译器可以推断泛型类型 T:

self.getMeGoodies("chocolatechip", callback: { (goodie : Goodie) -> () in
    println("eat the \(goodie)")
})

另一种方法是将类型作为参数传递给方法:

func getMeGoodies<T>(type : T.Type, goodieName : String, callback:(goodie:T) -> ()) {
    var goodie:T = 0 //get it from the jug
    callback(goodie: goodie)
}

self.getMeGoodies(Goodie.self, goodieName: "chocolatechip", callback: { (goodie)  in
    println("eat the \(goodie)")
})

关于ios - 在 Swift 中使用泛型进行类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507880/

相关文章:

ios - 如何在向左或向右移动时水平翻转 Sprite ?

ios - UIButton 中的 UIImage 用矢量图像像素化

swift - 类型 'AVCaptureDevice' 没有成员 'defaultDevice'

iphone - 如何更改 PHAssetCollection 列表的顺序

iOS:如何防止多次点击按钮创建多个新实例

ios - 更改权限时应用程序在后台崩溃 - swift

ios - UIWindow setRootViewController 不清除现有层次结构

ios - 如何下载 xcode 6 测试版?以及如何将 xcode 5 和 xcode 6 保存在同一台机器上?

ios - 在不同的线程中获取和使用 NSManagedObject

Swift NWListener 监听、取消、重新监听成功?