Xcode Swift泛型类类型既是子类又符合协议
我试图在Swift中编写一个泛型类,它的泛型类型既继承自一个类,又符合一个协议。但是,以下代码会导致编译器崩溃并出现分段错误:11Xcode Swift泛型类类型既是子类又符合协议,xcode,swift,Xcode,Swift,我试图在Swift中编写一个泛型类,它的泛型类型既继承自一个类,又符合一个协议。但是,以下代码会导致编译器崩溃并出现分段错误:11 protocol Protocol { var protocolProperty: Any? { get } } class Class { var classProperty: Any? } class GenericClass<T: Class where T: Protocol> { var genericProper
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
}
}
协议{
var protocolProperty:Any?{get}
}
班级{
var classProperty:有吗?
}
类泛型类{
var-genericProperty:T?
func foo(){
让classProperty:Any?=genericProperty!.classProperty
//这就是罪魁祸首
let protocolProperty:Any?=genericProperty!.protocolProperty
}
}
注释掉对protocol属性的访问权限可以让程序编译。在没有编译器崩溃的情况下,无法从协议访问任何内容。有没有办法创建一个这样工作的泛型类?正如MikeS所指出的,你应该为崩溃打开一个雷达。它永远不会崩溃 但解决方案是关注您实际需要
T
遵守的协议(即方法列表),而不是被类所包围。例如:
protocol WhatGenericClassHolds : Protocol {
var classProperty: Any? { get }
}
class GenericClass<T: WhatGenericClassHolds> { ... }
协议WhatGenericClassHolds:协议{
var classProperty:Any?{get}
}
类GenericClass{…}
您的声明中有一个问题。使您的类符合以下协议
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
协议A{
var somePropertyInt:Int?{get}
}
B类:A{
var someProperty:String?
var somePropertyInt:Int?;
}
类泛型类{
var someGenericProperty:T?
func foo(){
println(someGenericProperty!.someProperty)
println(someGenericProperty!.somePropertyInt)
}
}
var someGen=GenericClass()
someGen.someGenericProperty?somePropertyInt
someGen.someGenericProperty?someProperty
无论是哪种代码,编译器都不会崩溃。如果你还没有,你应该向苹果公司报告()。