如何将协议类型添加为子视图
How to add protocol type as subview
所以我写了一个简单的协议:
protocol PopupMessageType{
var cancelButton: UIButton {get set}
func cancel()
}
并有一个自定义视图:
class XYZMessageView: UIView, PopupMessageType {
...
}
然后我现在有:
class PopUpViewController: UIViewController {
//code...
var messageView : CCPopupMessageView!
private func setupUI(){
view.addSubview(messageView)
}
}
但我想做的是:
class PopUpViewController: UIViewController {
//code...
var messageView : PopupMessageType!
private func setupUI(){
view.addSubview(messageView) // ERROR
}
}
错误我得到:
Cannot convert value of type 'PopupMessageType!' to expected argument
type 'UIView'
编辑:
我在 Swift 2.3!
将 属性 messageView 的类型更改为 (UIView & PopupMessageType)!
我是说
class PopUpViewController: UIViewController {
//code...
var messageView : (UIView & PopupMessageType)!
private func setupUI(){
view.addSubview(messageView) // ERROR
}
}
在Swift4中你可以这样做:
typealias PopupMessageViewType = UIView & PopupMessageType
然后使用PopupMessageViewType
作为变量的类型。
免责声明:我不再拥有 swift 2.3 编译器,因为 swift 4 是 iOS 开发的新常态。以下代码可能需要调整才能在 swift 2.3
中运行
基本上我们将制作一个 2x1 多路复用器,其中两个输入是同一个对象。输出取决于您将 mux 设置为选择第一个还是第二个。
// The given protocol
protocol PopupMessageType{
var cancelButton: UIButton {get set}
func cancel()
}
// The object that conforms to that protocol
class XYZMessageView: UIView, PopupMessageType {
var cancelButton: UIButton = UIButton()
func cancel() {
}
}
// The mux that lets you choose the UIView subclass or the PopupMessageType
struct ObjectPopupMessageTypeProtocolMux<VIEW_TYPE: UIView> {
let view: VIEW_TYPE
let popupMessage: PopupMessageType
}
// A class that holds and instance to the ObjectPopupMessageTypeProtocolMux
class PopUpViewController: UIViewController {
var messageWrapper : ObjectPopupMessageTypeProtocolMux<UIView>!
private func setupUI(){
view.addSubview(messageWrapper.view)
}
}
//...
let vc = PopUpViewController() // create the view controller
let inputView = XYZMessageView() // create desired view
// create the ObjectPopupMessageTypeProtocolMux
vc.messageWrapper = ObjectPopupMessageTypeProtocolMux(view: inputView, popupMessage: inputView) //<-- 1
vc.messageWrapper.view // retreive the view
vc.messageWrapper.popupMessage.cancel() // access the protocol's methods
vc.messageWrapper.popupMessage.cancelButton // get the button
1) 我为 ObjectPopupMessageTypeProtocolMux 的初始化程序输入了两次 "inputView"。它们是相同的 class 实例,但它们被转换为不同的类型。
我希望这能帮助你到达你想去的地方 swift 2.3
所以我写了一个简单的协议:
protocol PopupMessageType{
var cancelButton: UIButton {get set}
func cancel()
}
并有一个自定义视图:
class XYZMessageView: UIView, PopupMessageType {
...
}
然后我现在有:
class PopUpViewController: UIViewController {
//code...
var messageView : CCPopupMessageView!
private func setupUI(){
view.addSubview(messageView)
}
}
但我想做的是:
class PopUpViewController: UIViewController {
//code...
var messageView : PopupMessageType!
private func setupUI(){
view.addSubview(messageView) // ERROR
}
}
错误我得到:
Cannot convert value of type 'PopupMessageType!' to expected argument type 'UIView'
编辑: 我在 Swift 2.3!
将 属性 messageView 的类型更改为 (UIView & PopupMessageType)!
我是说
class PopUpViewController: UIViewController {
//code...
var messageView : (UIView & PopupMessageType)!
private func setupUI(){
view.addSubview(messageView) // ERROR
}
}
在Swift4中你可以这样做:
typealias PopupMessageViewType = UIView & PopupMessageType
然后使用PopupMessageViewType
作为变量的类型。
免责声明:我不再拥有 swift 2.3 编译器,因为 swift 4 是 iOS 开发的新常态。以下代码可能需要调整才能在 swift 2.3
中运行基本上我们将制作一个 2x1 多路复用器,其中两个输入是同一个对象。输出取决于您将 mux 设置为选择第一个还是第二个。
// The given protocol
protocol PopupMessageType{
var cancelButton: UIButton {get set}
func cancel()
}
// The object that conforms to that protocol
class XYZMessageView: UIView, PopupMessageType {
var cancelButton: UIButton = UIButton()
func cancel() {
}
}
// The mux that lets you choose the UIView subclass or the PopupMessageType
struct ObjectPopupMessageTypeProtocolMux<VIEW_TYPE: UIView> {
let view: VIEW_TYPE
let popupMessage: PopupMessageType
}
// A class that holds and instance to the ObjectPopupMessageTypeProtocolMux
class PopUpViewController: UIViewController {
var messageWrapper : ObjectPopupMessageTypeProtocolMux<UIView>!
private func setupUI(){
view.addSubview(messageWrapper.view)
}
}
//...
let vc = PopUpViewController() // create the view controller
let inputView = XYZMessageView() // create desired view
// create the ObjectPopupMessageTypeProtocolMux
vc.messageWrapper = ObjectPopupMessageTypeProtocolMux(view: inputView, popupMessage: inputView) //<-- 1
vc.messageWrapper.view // retreive the view
vc.messageWrapper.popupMessage.cancel() // access the protocol's methods
vc.messageWrapper.popupMessage.cancelButton // get the button
1) 我为 ObjectPopupMessageTypeProtocolMux 的初始化程序输入了两次 "inputView"。它们是相同的 class 实例,但它们被转换为不同的类型。
我希望这能帮助你到达你想去的地方 swift 2.3