Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode Swift泛型类类型既是子类又符合协议_Xcode_Swift - Fatal编程技术网

Xcode Swift泛型类类型既是子类又符合协议

Xcode 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

我试图在Swift中编写一个泛型类,它的泛型类型既继承自一个类,又符合一个协议。但是,以下代码会导致编译器崩溃并出现分段错误: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
    }

}
协议{
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

无论是哪种代码,编译器都不会崩溃。如果你还没有,你应该向苹果公司报告()。