协议不止一次地间接实施另一个协议

时间:2014-07-04 11:44:43

标签: swift

我正在做一些测试项目来学习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。我该如何解决?

1 个答案:

答案 0 :(得分:0)

看起来这已在beta 3中得到修复。所以我猜这是一个错误。我准备提出雷达,但最后他们比我更快 。)