Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
Inheritance 在Swift中创建具有泛型、协议和继承的对象时执行错误访问_Inheritance_Swift_Protocols_Swift Playground_Generics - Fatal编程技术网

Inheritance 在Swift中创建具有泛型、协议和继承的对象时执行错误访问

Inheritance 在Swift中创建具有泛型、协议和继承的对象时执行错误访问,inheritance,swift,protocols,swift-playground,generics,Inheritance,Swift,Protocols,Swift Playground,Generics,此代码生成EXC_BAD_访问(即使在操场中) (为了更好地理解,我简化了代码。) 准备: 很明显,您可以像这样创建A和B的实例 A(); B(); 假设需要在具有泛型的函数中创建类的实例: func creation<T: EmptyInit>(x a:T.Type) -> T{ var object = T() return object; } 此代码在EXC\u访问错误时崩溃 var a = creation(x: A.self); 这很奇怪,不

此代码生成EXC_BAD_访问(即使在操场中)

(为了更好地理解,我简化了代码。)

准备:

很明显,您可以像这样创建
A
B
的实例

A();
B();
假设需要在具有泛型的函数中创建类的实例:

func creation<T: EmptyInit>(x a:T.Type) -> T{
    var object = T()
    return object;
}
此代码在EXC\u访问错误时崩溃

var a = creation(x: A.self);


这很奇怪,不是吗?我不明白。有什么想法吗?(甚至可能是一个Swift bug?

更新Swift 1.2 XCode 6.3 Beta 2(Beta 1将不起作用): 您的代码现在运行时没有任何问题,并且达到了预期的结果:

var b = creation(x: B.self); //{__lldb_expr_9.SecondBase}
var a = creation(x: A.self); //{__lldb_expr_11.FirstBase}

它们发生冲突,因为FirstBase没有init,但它是一个必需的init。 这样,它将起作用:

protocol EmptyInit {
    init();
}

class FirstBase {
    required init(){

    }
}


class SecondBase : EmptyInit {
    required init(){

    }
}

class A : FirstBase, EmptyInit{
    required init(){

    }
}

class B : SecondBase, EmptyInit {
    required init() {

    }
}

A();
B();


func creation<T: EmptyInit>(x a:T.Type) -> T{
    var object = T()
    return object;
}

var b = creation(x: B.self); // SecondBase
var a = creation(x: A.self); // FirstBase
protocolemptyinit{
init();
}
类一垒{
必需的init(){
}
}
类SecondBase:EmptyInit{
必需的init(){
}
}
A类:一垒,空的{
必需的init(){
}
}
B类:SecondBase,EmptyInit{
必需的init(){
}
}
A();
B();
函数创建(xa:T.Type)->T{
var object=T()
返回对象;
}
var b=创建(x:b.self);//二垒
var a=创建(x:a.self);//一垒

从苹果那里得到了答案:

“我们相信这个问题已经在最新的Xcode 6.3 beta 2中得到解决,包括iOS 8.3 SDK和Swift 1.2。”

无法更新atm。将检查(可能在VM中),然后再次发布更新


亚历克斯测试了一下。看来苹果已经解决了这个问题。谢谢Alex,我也把它放在了上。如果在类A实现中省略“override”怎么办?不会编译。错误消息是:重写声明需要一个“override”关键字。我也有同样的问题。。这在五月份就解决了,谢谢你的回答。你的意思是说你的回答是一种变通方法吗?实际上,我看不出为什么FirstBase应该实现init(){}。尽管为了避免撞车;-)我错过了什么吗?
FirstBase
必须实现它,因为
Class A
应符合协议
EmptyInit
。为了符合协议,它必须使用
required
属性实现协议所需的init。但它不能,因为它会与它继承的
FirstBase
冲突。如果类本身没有
required init
,则不能使用派生自该类的
required init
。这是有意义的:协议希望确保使用init。因此,如果一个类想要符合一个协议和这个init要求,它必须实现这个init。如果它现在也是从另一个类派生的,那么逻辑上必须确保该类也使用此requred初始值设定项。否则,您无法确保使用了init。很抱歉不理解:-),但是如果类FirstBase不在您的控制之下,该怎么办。这是否意味着如果该类不符合协议,就不能从该类继承?那么协议需要在继承层次结构上下实现吗?
var b = creation(x: B.self); //{__lldb_expr_9.SecondBase}
var a = creation(x: A.self); //{__lldb_expr_11.FirstBase}
protocol EmptyInit {
    init();
}

class FirstBase {
    required init(){

    }
}


class SecondBase : EmptyInit {
    required init(){

    }
}

class A : FirstBase, EmptyInit{
    required init(){

    }
}

class B : SecondBase, EmptyInit {
    required init() {

    }
}

A();
B();


func creation<T: EmptyInit>(x a:T.Type) -> T{
    var object = T()
    return object;
}

var b = creation(x: B.self); // SecondBase
var a = creation(x: A.self); // FirstBase