此代码生成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() {
}
}
很明显,您可以像这样创建A
和B
的实例。
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?)
答案 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