web-dev-qa-db-ja.com

Swiftのクラス専用プロトコル

Docsの 'Class-Only Protocols' を使用して、一部のクラス(すべてではない)に準拠させたい。私がやっていることは

protocol RefreshData: class, ClassA, ClassB
{
    func updateController()
}

そして、私はエラーを取得しています

non class type 'RefreshData cannot inherit from classA
non class type 'RefreshData cannot inherit from classB

ドキュメントのとおりにフォローしているかどうかはわかりません。これについて何かアイデアはありますか?

30
tonytran

Swift 4では、型を結合できるため、プロトコルを使用して、たとえば型エイリアスを作成して、特定のクラス要件と結合することができます。

(不自然な)例:

typealias PresentableVC = UIViewController & Presentable

提示されたコードの場合:

問題は、特定のクラスに制限しようとしていて、Swiftが(現時点では)できないことです。クラスに制限し、他のプロトコルからのみ継承できます。構文プロトコルの継承用ですが、クラスの制限として使用しようとしています。

クラスプロトコルの目的は次のとおりです。

そのプロトコルの要件で定義されている動作が、適合型に値のセマンティクスではなく参照セマンティクスがあることを前提または要求している場合、クラス専用プロトコルを使用します。

39
Wain

ChrisおよびWainで提供される答えは正しいです。ここにさらに詳細を追加します。

プロトコルの定義

protocol(クラスで使用可能)を宣言する概念を区別する必要があります

protocol RefreshData: class {
    func updateController()
}

クラスを定義する

...クラスをプロトコルに適合させるという概念から

class ClassA: RefreshData {
    func updateController() {

    }
}

自分が所有していないクラスを適合させる

クラスをプロトコルに適合させたいが、そのクラスのソースコードを所有していない場合があります。この場合、extensionを使用できます

extension ClassB: RefreshData {
    func updateController() {

    }
}
21
Luca Angeletti

Swiftはそれを行うことができます!必要なクラスをターゲットとするプロトコルおよびプロトコル拡張を行います!(拡張を特定のクラスに制限します)

    protocol Movable {
        func moveForward()
        func moveBackward()
    }

    extension Movable where Self: Car {
        func moveForward() {
            self.location.x += 10;
        }

        func moveBackward() {
            self.location.x -= 10;
        }
    }
    extension Movable where Self: Bike {
        func moveForward() {
            self.x += 1;
        }

        func moveBackward() {
            self.x -= 1;
        }
    }

    class Car: Movable {
        var location: CGPoint

        init(atLocation location: CGPoint) {
            self.location = location
        }
    }

    class Bike: Movable {
        var x: Int

        init(atX x: Int) {
            self.x = x
        }
}
9
AMTourky
protocol RefreshData : class
{
    func updateController()
}

class ClassA : RefreshData
{
    func updateController() {}
}

class ClassB : RefreshData
{
    func updateController() {}
}
3
Chris