Swift DeveloperSwift开发者iOS Developer

OC混编Swift中代理设计模式的小坑

2017-05-17  本文已影响87人  远辰jt

1,具体场景

2,二话不说上代码

// 1,定义协议
protocol SwiftViewDelegate {
    func removeSwiftView()
 }
// 2,添加代理属性
    var delegate : SwiftViewDelegate?
// 3,调用代理方法
 self.delegate?.removeSwiftView()
self.swiftView.delegate = self;
@interface ViewController ()<SwiftViewDelegate>

3,上面的这个套路在OC或者Swift中 完全没有问题。但是当把Swift的代理设置给OC的时候或者OC类遵守协议的时候就会报错

  Property 'delegate' not found on object of type 'SwiftView *'

  提示你找不到代理属性,可是已经在Swift中已经定义了啊
  Cannot find protocol declaration for 'SwiftViewDelegate'
  我擦,这是啥情况,我明明在Swift类中定义了协议并且在OC中导入了"XXX-Swift.h"头文件 怎么就找不到SwiftViewDelegate

4,什么原因呢

  “可选的协议要求只能用在标记 @objc 特性的协议中。
该特性表示协议将暴露给 Objective-C 代码,详情参见Using Swift with Cocoa and Objective-C(Swift 2.2)。即使你不打算和 Objective-C 有什么交互,如果你想要指定可选的协议要求,那么还是要为协议加上 @objc 特性。
还需要注意的是,标记 @objc 特性的协议只能被继承自 Objective-C 类的类或者 @objc 类采纳,其他类以及结构体和枚举均不能采纳这种协议。”

5,正确姿势

@objc protocol SwiftViewDelegate {
    
    func removeSwiftView()
}
  

6,demo源码

https://github.com/JTWang4778/DelegateInOCSwfit.git

7,对于@objc的详细作用请参考文章

http://www.cnblogs.com/Rinpe/p/5466470.html

上一篇下一篇

猜你喜欢

热点阅读