5

特定のクラスによって実装されるプロトコルを作成しようとしていますが、それらすべても実装する必要がありますUIScrollViewDelegate。私が考えたのは、私の新しいプロトコルがプロトコルを実装することですUIScrollViewDelegate

protocol MyProtocol: UIScrollViewDelegate {
    var myVar: NSString { get }
    func myMethod()
}

プロトコルにはデフォルトの実装が必要なので、このプロトコルの拡張機能も作成しました。

extension MyProtocol {
    func myMethod() {
        print("I'm printing")
    }

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

コンパイルはできますが、動作しません。私は何を間違っていますか?拡張されたプロトコルのデフォルトの実装を作成する正しい方法は何ですか?

4

1 に答える 1

5

やりたいことは次のとおりです。

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 と同等です。

したがって、あなたがすることは次のとおりです。

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

このエラーは、それ自体がNSObject によって実装された目的の C プロトコルであるUIScrollViewDelegate拡張として定義されているためです。NSObjectProtocol

したがって、クラスを NSObject から継承して、NSObjectProtocol に準拠させます。バニラ Swift クラスはそうではありません。

于 2016-02-09T13:06:21.087 に答える