首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协议实现协议的默认实现

协议实现协议的默认实现
EN

Stack Overflow用户
提问于 2016-02-09 12:26:49
回答 1查看 3.9K关注 0票数 5

我正在尝试创建一个由特定类实现的协议,它们都应该实现UIScrollViewDelegate。我想到的是我的新协议实现了协议UIScrollViewDelegate

代码语言:javascript
复制
protocol MyProtocol: UIScrollViewDelegate {
    var myVar: NSString { get }
    func myMethod()
}

由于协议应该有其默认实现,所以我还为该协议创建了一个扩展。

代码语言:javascript
复制
extension MyProtocol {
    func myMethod() {
        print("I'm printing")
    }

    func scrollViewDidScroll(scrollView: UIScrollView) {
        print("I'm scrollin")
    }
}

它编译,但不工作。我做错了什么,创建扩展协议的默认实现的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2016-02-09 13:06:21

您要做的是:

代码语言:javascript
复制
protocol MyProtocol{
    var myVar: NSString { get }
    func myMethod()
}

protocol MyProtocol2{
    var myVar2: NSString { get }
    func myMethod2()
}

extension MyProtocol where Self: MyProtocol2 {
    func myMethod() {
        print("I'm printing ")
    }
}

class anotherClass: MyProtocol, MyProtocol2 {
    var myVar: NSString {
        return "Yo"
    }

    var myVar2: NSString {
        return "Yo2"
    }

    func myMethod2() {
        print("I'm printing in myMethod2")
    }
}

在上面的代码中,MyProtocol2等同于您的UIScrollViewDelegate,

因此,你要做的是:

代码语言:javascript
复制
protocol MyProtocol{
    var myVar: NSString { get }
    func myMethod()
}

extension MyProtocol where Self: UIScrollViewDelegate {
    func myMethod() {
        print("I'm printing")
    }
}

class anotherClass: NSObject, MyProtocol, UIScrollViewDelegate {
    var myVar: NSString {
        return "Yo"
    }
}

注意,另一个类子类NSObject,这是因为如果不这样做,您将得到错误

anotherClass不符合NSObjectProtocol协议

这个错误是因为UIScrollViewDelegate本身被定义为扩展NSObjectProtocol,这是一个由NSObject实现的目标-C协议。

因此,让您的类从NSObject继承以符合NSObjectProtocol。香草斯威夫特类没有。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35292065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档