Objective c 从Swift中的非泛型函数调用泛型函数

Objective c 从Swift中的非泛型函数调用泛型函数,objective-c,swift,generics,interop,Objective C,Swift,Generics,Interop,MMCondition是Swift中定义的协议,但与Objective-C(用@objc注释)互操作 我有以下代码: // 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 OperationConditionImple

MMCondition
是Swift中定义的协议,但与Objective-C(用@objc注释)互操作

我有以下代码:

// 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
    }
}

//addCondition不能是泛型的,因为我希望它也可以从Objective-C访问。
公共函数添加条件(条件:MMCondition){
//如何在此处初始化OperationConditionImplementer?
让operationCondition=OperationConditionImplementer(条件:条件)//不编译
//错误:无法使用类型为“(条件:MMCondition)”的参数列表调用类型为“OperationConditionImplementer”的初始值设定项
//我能否以某种方式使用condition.dynamicType初始化OperationConditionImplementer?
}
结构操作条件实现器{
让条件:T
静态变量名:String{
返回“静默”
}
静态var是唯一的:Bool{
返回T.isMutuallyExclusive
}
初始(条件:T){
自我状态
}
}

从Objective-C中,您不能使用中所述的泛型

您可以访问类或协议中任何 标记为@objc属性,只要它与 目标C。这不包括仅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)
        }
    }
}
您将看到打印的“ExampleCondition”

如果最终切换到纯Swift,则需要在初始化
操作条件实施器时指定
T

您可以将
addCondition
方法定义为:

func addCondition<T: MMCondition>(condition: T) {
   let a = OperationConditionImplementer<T>(condition: condition)
}
func addCondition(条件:T){
设a=OperationConditionImplementer(条件:条件)
}

因为通用类的Swift 2.0实例可以实现Objective-C协议。我认为不可能的是让结构实现协议。事实上,我希望您的协议可能需要继承自NSObjectProtocol,以便在Objective-C中可用,这将阻止您使用结构或枚举实现协议

您还正确地提到,您不能从Objective-C访问泛型函数


有关使用泛型实现Objective-C协议的具体示例,请查看

addCondition不能是泛型的,因为我希望它也可以从Objective-C访问。实际上,您不能在Obj-C中使用泛型,编辑回答这是否意味着在我的示例中func addCondition(没有泛型)不能正确实例化OperationConditionImplementer?正确,您需要类型来实例化实现者,这不能在运行时决定。一个选项是,正如您所建议的,使用初始值设定项构建它并检查其中的类型,但是您需要完全删除所有泛型内容,以便从对象中使用它,因为它是完全独占的,并且名称是静态的,这种方法会带来一系列不同的问题。
class ExampleCondition: NSObject, MMCondition {
    static var name: String  = "ExampleCondition"
    static var isMutuallyExclusive: Bool = false
}

let example = OperationConditionImplementer(condition: ExampleCondition())
func addCondition<T: MMCondition>(condition: T) {
   let a = OperationConditionImplementer<T>(condition: condition)
}