为什么这个简单的Swift泛型构造无法编译?

时间:2015-05-25 20:02:39

标签: ios xcode swift generics

我正在开发我的第一个基于Swift的项目(xcode 6.3.2),并且似乎没有一个简单的泛型构造来构建。

以下似乎无法在xcode 6.3.2(编译器退出代码为1)上编译:

// with :AnyObject constraint => compiler crash
class GenericsTest : MyDelegate{

    static let instance = GenericsTest()

    private init(){
        var wrapper = MyWrapper<MyDelegate>(inner: self)

        if let md = wrapper.inner {
            println("delegate value \(md.someString)")
        }
    }

    // MyDelegate impl
    var someString = "my delegate impl"

}

protocol MyDelegate : class {
    var someString : String {get set}
}

class MyWrapper<T: AnyObject>{
    private (set) var inner : T?

    init(inner : T){
        self.inner = inner
    }

}

看起来Swift编译器不喜欢MyWrapper的:AnyObject类型约束;以下代码编译并运行没有任何问题:

// no :AnyObject constraint
class GenericsTest : MyDelegate{

    static let instance = GenericsTest()

    private init(){
        var wrapper = MyWrapper<MyDelegate>(inner: self)

        if let md = wrapper.inner {
            println("delegate value \(md.someString)")
        }
    }

    // MyDelegate impl
    var someString = "my delegate impl"

}

protocol MyDelegate : class {
    var someString : String {get set}
}

class MyWrapper<T>{
    private (set) var inner : T?

    init(inner : T){
        self.inner = inner
    }

}

我需要:AnyObject类型约束,因为我实际上试图创建一个弱包装器,这需要这个约束,如下所示:

// with weak wrapper and obligatory :AnyObject constraint (compiler crash)
class GenericsTest : MyDelegate{

    static let instance = GenericsTest()

    private init(){
        var wrapper = MyWrapper<MyDelegate>(inner: self)

        if let md = wrapper.inner {
            println("delegate value : \(md.someString)")
        }
    }

    // MyDelegate impl
    var someString = "my delegate impl"

}

protocol MyDelegate : class {
    var someString : String {get set}
}

class MyWrapper<T: AnyObject>{
    weak private (set) var inner : T?

    init(inner : T){
        self.inner = inner
    }

}

任何人都知道如何解决这个问题?

0 个答案:

没有答案