Swift泛型类类型都是子类并且符合协议

时间:2014-09-25 17:57:06

标签: xcode swift

我试图在Swift中编写一个泛型类,它的泛型类型都从类继承并符合协议。但是,以下代码导致编译器崩溃,并出现Segmentation fault:11。

protocol Protocol {
    var protocolProperty: Any? { get }
}

class Class {
    var classProperty: Any?
}

class GenericClass<T: Class where T: Protocol> {

    var genericProperty: T?

    func foo() {
        let classProperty: Any? = genericProperty!.classProperty
        // This is the culprit
        let protocolProperty: Any? = genericProperty!.protocolProperty
    }

}

注释掉对协议属性的访问权限允许程序进行编译。在没有编译器崩溃的情况下,无法从协议访问任何内容。是否有一种解决方法来创建一个像这样工作的泛型类?

2 个答案:

答案 0 :(得分:2)

正如MikeS所说,你应该为坠机打开雷达。它永远不应该崩溃。

但是解决方案是专注于你真正需要T符合的协议(即方法列表),而不是在课堂上被包裹起来。例如:

protocol WhatGenericClassHolds : Protocol {
  var classProperty: Any? { get }
}

class GenericClass<T: WhatGenericClassHolds> { ... }

答案 1 :(得分:0)

您的声明中存在问题。使您的班级符合以下协议

protocol A {
    var somePropertyInt : Int? {get }
}

class B:A {
    var someProperty : String? 
    var somePropertyInt:Int?;
}


class GenericClass<T: B where T: A  > {
    var someGenericProperty : T?

    func foo() {
         println(someGenericProperty!.someProperty)
         println(someGenericProperty!.somePropertyInt)   
    }
}


var someGen = GenericClass()

 someGen.someGenericProperty?.somePropertyInt
 someGen.someGenericProperty?.someProperty