我可以强制Swift中的协议构造吗?

时间:2014-09-24 05:19:37

标签: ios objective-c swift protocols

我想这样做:

UIView <UITextFieldDelegate>*

在swift。

使子类UIView的对象也符合UITextFieldDelegate协议。

2 个答案:

答案 0 :(得分:2)

您可以使用Protocol Composition来表达(id <UITextFieldDelegate, UIScrollViewDelegate>) 但不是(UIView<UITextFieldDelegate> *)。除了类定义

// Obj-C
- (void)methodName:(id <UITextFieldDelegate, UIScrollViewDelegate>)arg { ... }

// Swift
func methodName(arg:protocol<UITextFieldDelegate, UIScrollViewDelegate>!) { ... }

实际上,一个Obj-C方法被声明为- (void)methodName((UIView<UITextFieldDelegate> *))arg;,当它被桥接到Swift时,你可以使用任何UIView实例进行调用。

enter image description here

修改

经过一番研究后,您似乎可以声明func这样的

func myFunc<T:UIView where T:UITextFieldDelegate>(view:T) { ... }

答案 1 :(得分:1)

创建UIView的子类,让SubClassedView符合UITextFieldDelegate

以传统方式

@interface SubClassedView:UIView <UITextFieldDelegate>

@end

in swift

class SubClassedView:UIView, UITextFieldDelegate {

}