在Swift中使用泛型,协议和继承创建对象时的EXC_BAD_ACCESS

时间:2015-01-16 16:57:35

标签: inheritance swift protocols swift-playground generics

此代码生成EXC_BAD_ACCESS(即使在游乐场中)。

(我简化了我的代码以便更好地理解。)

的制备:将

// Playground - noun: a place where people can play

protocol EmptyInit {
    init();
}

class FirstBase {

}


class SecondBase : EmptyInit {
    required init(){

    }
}

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

    }
}

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

    }
}

很明显,您可以像这样创建AB的实例。

A();
B();

我们假设需要使用泛型在函数内创建类的实例:

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

虽然此代码正常运行:

var b = creation(x: B.self);

此代码与EXC_BAD_ACCESS

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

link to the screenshot of the playground

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

2 个答案:

答案 0 :(得分:3)

更新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但EmptyInit是必需的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

答案 1 :(得分:0)

Apple获得答案:

&#34;我们认为此问题已在最新的Xcode 6.3 beta 2中得到解决,包括带有Swift 1.2的iOS 8.3 SDK。&#34;

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

Alex测试了它。似乎Apple修复了这个漏洞。谢谢Alex