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
ドキュメントのとおりにフォローしているかどうかはわかりません。これについて何かアイデアはありますか?
Swift 4では、型を結合できるため、プロトコルを使用して、たとえば型エイリアスを作成して、特定のクラス要件と結合することができます。
(不自然な)例:
typealias PresentableVC = UIViewController & Presentable
提示されたコードの場合:
問題は、特定のクラスに制限しようとしていて、Swiftが(現時点では)できないことです。クラスに制限し、他のプロトコルからのみ継承できます。構文プロトコルの継承用ですが、クラスの制限として使用しようとしています。
クラスプロトコルの目的は次のとおりです。
そのプロトコルの要件で定義されている動作が、適合型に値のセマンティクスではなく参照セマンティクスがあることを前提または要求している場合、クラス専用プロトコルを使用します。
ChrisおよびWainで提供される答えは正しいです。ここにさらに詳細を追加します。
protocol
(クラスで使用可能)を宣言する概念を区別する必要があります
protocol RefreshData: class {
func updateController()
}
...クラスをプロトコルに適合させるという概念から
class ClassA: RefreshData {
func updateController() {
}
}
クラスをプロトコルに適合させたいが、そのクラスのソースコードを所有していない場合があります。この場合、extension
を使用できます
extension ClassB: RefreshData {
func updateController() {
}
}
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
}
}
protocol RefreshData : class
{
func updateController()
}
class ClassA : RefreshData
{
func updateController() {}
}
class ClassB : RefreshData
{
func updateController() {}
}