协议问题

时间:2017-04-20 06:31:45

标签: ios iphone swift swift-protocols type-alias

我希望有一种符合我的自定义协议的UIView。我尝试这样做,但Xcode说它不是一个适当的声明:

typealias ViewThatConformsToProtocol = UIView: MyCustomProtocol

这也不起作用:

typealias ViewThatConformsToProtocol = UIView, MyCustomProtocol

但我不想为此使用子类。有没有办法做到这一点?

P.S。 通过子类化,我会这样:

class ViewThatConformsToProtocol: UIView, MyCustomProtocol {

}

但我不想使用子类,因为它违反了我的设计模式(例如,因为当我只需要知道我的View支持此协议的行为时,我就不会这样做希望这个视图继承ViewThatConformsToProtocol。有时View1可以确认Protocol1和Protocol2,但View2可以符合Protocol1和Protocol3 - 它只是例如)。在Objective-C中,您可以轻松声明UIView *viewForProtocol = (UIView<MyCustomProtocol> *)view1,但在SWIFT中它似乎是不可能的,所以我正在寻找绕行

3 个答案:

答案 0 :(得分:1)

typealias DesiredAlias<T> = T where T:MyCustomProtocol

//you can assign type like below
var variableThatConformsToProtocol: DesiredAlias<MyCustomProtocol>

也许这段代码符合您的要求?实际上它需要符合MyCustomProtocol的任何类型,因此它类似id<MyCustomProtocol> variableThatConformsToProtocol中的Objective-C

答案 1 :(得分:0)

实际上@ MaxPevsner的建议是对的,但并不准确。 你不需要使用typealias,因为所有魔法都可以做泛型。

protocol MyCustomProtocol {
    // ...
}

class MyCustomView: UIView, MyCustomProtocol {

}

class MyClass<T> where T: MyCustomProtocol {

    func someFunction<T>(_ value: T) {
        self.property = value
    }
}

// ...
let view = MyCustomView()
let trick = MyClass<MyCustomView>()
trick.someFunction(view)

它是否符合您的要求?

答案 2 :(得分:0)

typealias是特定类型的别名。你要求的东西符合一系列条件

根据您发布的代码段

UIView *viewForProtocol = (UIView<MyCustomProtocol> *)view1 

等效的swift代码是

let viewForProtocol = view1 as? MyCustomProtocol as ? UIView