如何将生成协议声明为委托?

时间:2015-06-01 08:35:42

标签: swift generics protocols

我们可以制作如下的生成协议:

protocol SomeDelegate {
    typealias T
    func xxx(x: T)
}

并使某些类符合它:

class AA: SomeDelegate {
    typealias T = Int
    func xxx(x: T) {
        // do some thing
    }
}

我的问题是如何声明某些属性符合生成协议,如下所示:

class BB {
    var delegate: SomeDelegate
}

上面的代码会引发错误:

Protocol 'SomeDelegate' can only be used as a generic constraint 
because it has Self or associated type requirements 

似乎我可以将协议用作代理,如下所示:

class BB {
    var delegate: AA?
}

但是,这不是我想要的,它会导致我的委托不能继承其他父类

2 个答案:

答案 0 :(得分:1)

您可以使用泛型,使用SomeDelegate作为类型约束:

class BB <U : SomeDelegate> {
   var delegate: U? = nil
}

这样,您只需在初始化U的实例时提供BB类型:

struct MyStruct : SomeDelegate {
    // The argument of xxx needs to be a concrete type here.
    func xxx(x: Int) {
        // ...
    }
}

let bb = BB<MyStruct>()

答案 1 :(得分:0)

您可以通过几种方法解决此错误。

protocol SomeDelegate {
    typealias T
    func xxx(x: T)
}

首先为函数使用正确的类型类,编译器会推断出类型本身。

 class AA: SomeDelegate {
    func xxx(x: Int) {
        println(x)
    }
   }

或者,您也可以覆盖类型并为其指定正确的类型类,如

class AA: SomeDelegate {
    typealias T = Int
    func xxx(x: T) {
        println(x)
    }
}

然后就像你做的那样使用它,

class B {
    var someDelegate: AA?
}