作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在做一些测试项目来学习 Swift,但有一个编译问题我无法解决。
我定义了这样一个协议(protocol):
@objc protocol MyDataProvider : UICollectionViewDataSource, UICollectionViewDelegate, NSObjectProtocol {
var myData : AnyObject { get }
}
和一个实现它的类:
class MyData : NSObject, MyDataProvider {
var myData:AnyObject
init() {
self.myData = Int()
}
func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {
return nil
}
}
我可以创建该类的实例并通过协议(protocol)变量引用它:
let dataProvider : MyDataProvider = MyData()
接下来,我想在 View Controller 中使用该实例:
class MyController : UIViewController {
let dataProvider : MyDataProvider = MyData()
@IBOutlet var collectionView : UICollectionView
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView.dataSource = dataProvider
self.collectionView.delegate = dataProvider
}
}
编译器将最后 2 个赋值报告为错误,错误消息如下:
Type 'MyDataProvider' does not conform to protocol 'NSObjectProtocol'
如果我不使用接口(interface)并将属性声明为类类型:
let dataProvider = MyDate()
它确实编译。所以 MyDataProvider
协议(protocol)一定有问题,我就是想不通。
如果我删除接口(interface)实现的 2 个委托(delegate)之一,在注释完 viewDidLoad()
中的相应行后,编译仍然失败。但是,如果我从协议(protocol)中删除 NSObjectProtocol
:
protocol MyDataProvider : UICollectionViewDelegate {
var myData : AnyObject { get }
}
现在编译成功了。好的,UICollectionViewDelegate
实现了 NSObjectProtocol
,所以看起来一个协议(protocol)不能直接或间接地实现另一个协议(protocol)超过一次。但是,如果我从界面中删除 NSObjectProtocol
并保留两个 Collection View 委托(delegate):
protocol MyDataProvider : UICollectionViewDataSource, UICollectionViewDelegate {
var myData : AnyObject { get }
}
编译仍然失败,因为两者都实现了NSObjectProtocol
。我该如何解决?
最佳答案
看起来这已经在 beta 3 中修复了。所以我猜这是一个错误。我正要提交雷达,但最后他们比我更快:)
关于swift - 协议(protocol)间接实现另一个协议(protocol)不止一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24573532/
我是一名优秀的程序员,十分优秀!