我正在做一些测试项目来学习Swift,还有一个我无法解决的编译问题。
我已经定义了这样的协议:
@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
}
}
我可以创建该类的实例并通过协议变量引用它:
let dataProvider : MyDataProvider = MyData()
接下来,我想在视图控制器中使用该实例:
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'
如果我不使用该接口并将该属性声明为类类型:
let dataProvider = MyDate()
它确实编译。所以MyDataProvider
协议中一定有问题,我无法弄清楚是什么。
如果删除接口实现的2个委托中的一个,则在注释viewDidLoad()
编译中的相应行后仍然会失败。但是,如果我从协议中删除NSObjectProtocol
:
protocol MyDataProvider : UICollectionViewDelegate {
var myData : AnyObject { get }
}
编译现在成功了。好的,UICollectionViewDelegate
实现了NSObjectProtocol
,所以看起来协议不能直接或间接地多次实现另一个协议。但是,如果我从界面中删除NSObjectProtocol
并保留两个集合视图委托:
protocol MyDataProvider : UICollectionViewDataSource, UICollectionViewDelegate {
var myData : AnyObject { get }
}
编译仍然失败,因为它们都实现了NSObjectProtocol
。我该如何解决?
答案 0 :(得分:0)
看起来这已在beta 3中得到修复。所以我猜这是一个错误。我准备提出雷达,但最后他们比我更快 。)