![](/img/trans.png)
[英]Scripting Bridge for iTunes in Swift 2 - cannot specialize non-generic type
[英]Call generic function from non-generic function in Swift
MMCondition
是Swift中定义的协议,但与Objective-C(使用@objc注释)互操作。
@objc public protocol MMCondition {
static var name: String { get }
static var isMutuallyExclusive: Bool { get }
}
我有以下代码:
// addCondition cannot be generic as I want it to be accessible from Objective-C as well.
public func addCondition(condition: MMCondition) {
// How do I initialize OperationConditionImplementer here?
let operationCondition = OperationConditionImplementer(condition: condition) // doesn't compile
// Error: Cannot invoke initializer for type 'OperationConditionImplementer<T>' with an argument list of type '(condition: MMCondition)'
// Can I use condition.dynamicType to init OperationConditionImplementer somehow?
}
struct OperationConditionImplementer<T: MMCondition> {
let condition: T
static var name: String {
return "Silent<\(T.name)>"
}
static var isMutuallyExclusive: Bool {
return T.isMutuallyExclusive
}
init(condition: T) {
self.condition = condition
}
}
从Objective-C,您不能使用文档中所述的泛型。
只要与Objective-C兼容,您就可以访问使用@objc属性标记的类或协议中的任何内容。 这不包括仅限Swift的功能,例如此处列出的功能:
- 泛型
...
所以你需要完全删除泛型代码。 一种可能的解决方案可能是
@objc protocol MMCondition {
static var name: String { get }
static var isMutuallyExclusive: Bool { get }
}
struct OperationConditionImplementer {
let condition: MMCondition
var name: String {
return "Silent<\(condition.dynamicType.name)>"
}
var isMutuallyExclusive: Bool {
return condition.dynamicType.isMutuallyExclusive
}
init(condition: MMCondition) {
self.condition = condition
// Here decide comparing types
if condition.dynamicType === ExampleCondition.self {
print(condition.dynamicType.name)
}
}
}
例如,如果你在游乐场尝试一下:
class ExampleCondition: NSObject, MMCondition {
static var name: String = "ExampleCondition"
static var isMutuallyExclusive: Bool = false
}
let example = OperationConditionImplementer(condition: ExampleCondition())
你会看到印有“ExampleCondition”。
如果最终切换到纯Swift,则需要在初始化OperationConditionImplementer
时指定T
您可以实现将addCondition
方法定义为:
func addCondition<T: MMCondition>(condition: T) {
let a = OperationConditionImplementer<T>(condition: condition)
}
由于Swift 2.0泛型类的实例可以实现Objective-C协议。 什么是不可能的我相信有一个结构实现协议。 事实上,我希望您的协议可能需要继承NSObjectProtocol才能在Objective-C中使用,这会阻止您使用结构或枚举来实现协议。
您还正确地提到您无法访问Objective-C中的泛型函数。
有关使用泛型来实现Objective-C协议的具体示例,请查看此博客文章 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.