我希望有一种符合我的自定义协议的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中它似乎是不可能的,所以我正在寻找绕行
答案 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