从泛型 class 传递自引用

Passing self reference to from a generic class

我想知道如何从通用 class 传递 self 引用。换句话说,如何去掉下面代码中的 AnyObject

protocol StateControllerDelegate: class {

    typealias StateType

    func stateController(stateController: AnyObject, didTransitionFromState fromState: StateType, toState: StateType)

}

class StateController<StateControllerDelegateType: StateControllerDelegate> {

    var delegate: StateControllerDelegateType?

}

谢谢!

试试这个。

protocol StateControllerDelegate: class {

    typealias StateType

    func stateController(stateController: StateController<Self>, didTransitionFromState fromState: StateType, toState: StateType)

    var fromState: StateType { get }
    var   toState: StateType { get }
}

class StateController<StateControllerDelegateType: StateControllerDelegate> {

    var delegate: StateControllerDelegateType?

    func callDelegate() {
        delegate!.stateController(self,
            didTransitionFromState: delegate!.fromState,
                           toState: delegate!.toState)
    }
}

final class MyDelegate: StateControllerDelegate {

    typealias StateType = Int

    func stateController(stateController: StateController<MyDelegate>, didTransitionFromState fromState: StateType, toState: StateType) {
        println("fromState=\(fromState), toState=\(toState)")
    }

    var fromState: StateType { return 0; }
    var   toState: StateType { return 1; }
}


let ctrl = StateController<MyDelegate>()
ctrl.delegate = MyDelegate()
ctrl.callDelegate()

编辑;我想对重点进行解释。

我将 MyDelegate 设为 final class,因为如果我不这样做,MyDelegate 上下文中的 StateController<Self> 表示 StateController<T>(其中T可以是继承MyDelegate的任何类型),所以函数签名中的StateController<MyDelegate>不符合StateController<Self>。目前,Swift 不支持任何 covariance/contravariance-like 功能,因此使 StateController<Y>StateController<X> 兼容(其中 Y 扩展 X)是不可能的。但是一旦我将 final 添加到 class MyDelegate,现在 StateController<Self> 就意味着 StateController<MyDelegate>(在 MyDelegate 的上下文中)。