【发布时间】:2015-01-15 11:30:03
【问题描述】:
我想声明一个符合特定协议的视图。一方面,我需要能够将其指定为 UIView,以便能够将其添加为子视图并期望符合协议。
问题开始于,我想为一个可以编辑或不可编辑的文本视图创建一个通用容器。
我决定为此使用不同的类——当它不可编辑时为 UILabel,当它可编辑时为 UITextField。所以在我的通用容器中,我希望能够 1. 将视图添加为子视图 2. 能够设置文本。
UILabel 和 UITextField 没有设置文本的通用接口,所以我让它们使用扩展实现一个新协议:
protocol TextView {
var text_:String? {get set}
}
extension UILabel:TextView {
var text_:String? {
get {
return self.text
}
set {
self.text = newValue
}
}
}
extension UITextField: TextView {
var text_:String? {
get {
return self.text
}
set {
self.text = newValue
}
}
}
到目前为止一切顺利 - 但在我的容器视图中,我需要将通用视图声明为 UIView 或 TextView。如果我将其作为 TextView 进行,则必须进行转换才能将它们添加为子视图,如果将其声明为 UIView,则必须在要设置文本时进行转换。
我希望能够指定(编译时间)“此变量是符合 TextView 协议的 UIView”之类的内容。我怎样才能做到这一点?如果不可能,解决此类问题的推荐方法是什么?
谢谢!
【问题讨论】:
-
您要检查
UIView实例变量是否符合您的协议? -
@rakeshbs 不完全是,我知道我可以在运行时使用 is/as 进行此类检查。我希望能够设置一个约束或其他东西,以便编译器强制该变量是一个也符合 TextView 协议的 UIView。但我怀疑这是不可能的。在那种情况下,我想知道一个可用的设计模式/不同的方法来解决这个问题。
-
哦,该死的!实际上,该线程中的问题回答了我的问题 - 不确定这是否是有效的重复。我知道我错过了一些基本的东西:
<T where T:UIView, T:TextView> -
那我认为这不是一个重复的问题。 可能之前已经回答过,但可能很难找到确切的重复项。
标签: swift