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