2016-12-04 29 views
0

は、私は事前に謝罪タイトルは不明であるが、私はこれが最初のいくつかのコードスニペットで可能であるか知りたい場合:異なるクラスを異なるプロトコルの同じプロトコルにするにはどうしたらいいですか?

ClassOne:

@objc protocol FetchProtocol 
{ 
    var someVar: Bool 
    { 
     get set 
    } 

    var someUIView: FetchProtocol 
    { 
     get set 
    } 

    func someFuncOne() 
} 

class ClassOne: UIViewController, FetchProtocol 
{ 
    ... 

    @IBOutlet var someUIView: FetchProtocol! 

    .... 

} 

ClassTwo:

@objc protocol FetchProtocol 
{ 
    var someVar: Bool 
    { 
     get set 
    } 

    var someTableView: FetchProtocol 
    { 
     get set 
    } 

    var someUIView: FetchProtocol 
    { 
     get set 
    } 

    func someFuncOne() 
    func someFuncTwo() 
} 

class ClassTwo: UIViewController, FetchProtocol 
{ 
    ... 

    @IBOutlet var someTableView: FetchProtocol! 
    @IBOutlet var someUIView: FetchProtocol! 

    .... 

} 

両方ClassOneClassTwoは同じFetchProtocolに一致し、両方のクラスは同じsomeVarsomeFuncOneを使用しますが、ClassTwoも、ClassTwoに固有のsomeTableViewsomeFuncTwoを使用しています。

どちらのクラスでも同じプロトコルを使用できますが、他のクラスには「追加の」骨格の実装がありますか?例えば

、次のようなもの:

if let vc = currentVC as? FetchProtocol 
{ 
    if vc.someVar == true 
    { 
     // Check if vc is of class type ClassOne, call someFuncOne 

     // Otherwise if vc is of class type ClassTwo, call someFuncOne and someFuncTwo 

    } 
} 

は、プロトコルを使用して上記の可能性のようなものですし、もしそうなら、どのようにそれを正しく実装するために、または別の選択肢がありますか?

+1

プロトコル2をプロトコル1から継承し、プロトコル2を拡張して、必要な余分なものを含めるようにします。 – Alexander

+0

@AlexanderMomchliov:意味がありますが、追加の 'someFuncTwo'を呼び出す前に、' vc'が特定のクラス型であるかどうかを確認するにはどうすればいいですか? – Pangu

+1

なぜそれがどのクラスであるかチェックしていますか?それは最初にプロトコルを持つ目的を破るものです。 – Alexander

答えて

1

あなたのコードはコンパイルされていません。私はあなたがものをオーバーコンプリートしていると思うし、はそれらを使用するためにプロトコルを使用しています。。なぜ、すべてのプロトコルを削除し、ちょうどない

if let vc = currentVC as? FetchProtocol 
{ 
    if vc.someVar == true 
    { 
     // Check if vc is of class type ClassOne, call someFuncOne 

     // Otherwise if vc is of class type ClassTwo, call someFuncOne and someFuncTwo 

    } 
} 

:あなたがしたいすべてがこのであればまったくのプロトコルを使用する必要はありません

if currentVC.someVar { 
    if let class1 = currentVC as? ClassOne { 
     class1.someFuncOne() 
    } else if let class2 = currentVC as? ClassTwo { 
     class2.someFuncOne() 
     class2.someFuncTwo() 
    } 
} 

あなたは本当にここのプロトコルを必要としませんプロトコルが存在するかどうかにかかわらず、currentVCClassOneClassTwoかどうかを確認する必要があります。

プロトコルは「ブラックボックス」のように動作します。この方法を考えてみましょう:

func foo(fetchObj: FetchProtocol) { 
    fetchObj.someFuncOne() 
} 

foo

fetchObj が本当に何であるかを気にしません。それはちょうど「私はあなたが何であるか気にしない、ちょうど someFuncOneをする!あなたがここで何をしようとして

は全く逆である:「私はあなたがClassOneなら、あなたは何ケアを行い、これを行うあなたはClassTwoしている場合は、それを行う。。。」

+0

あなたの 'あなたは本当にプロトコルは必要ありません。 'someVar'が両方のクラスで宣言され、使用されているので、繰り返しコードを避けようとしていたと思います。もしあなたが提案したものを実装すれば' if class1.someVar == true {class1.someFuncOne()} class2.someFuncOne()class2.someFuncTwo()} '、' someVar'を独自の方法で使用して複数のクラスがある場合に繰り返します。 – Pangu

+0

@Pangu次に、プロトコル 'someVar':'プロトコルFetchProtocol {var someVar:Bool {get set}} 'を呼び出します。 – Sweeper

1

あなたの問題は非常に抽象的で、かなりフォローするのは難しいですが、これはあなたが求めていることです。つまり、ここでプロトコルを使用する必要はありません。

protocol P1 { 
    var someVar1: String { get } 

    func func1(); 
} 

protocol P2: P1 { 
    var someVar2: String { get } 
    func func2(); 
} 


class C1: P1 { 
    var someVar1 = "String 1 in C1" 

    func func1() { 
     print(someVar1) 
    } 
} 

class C2: P2 { 
    var someVar1 = "String 1 in C2" 
    var someVar2 = "String 2 in C2" 

    func func1() { 
     print(someVar1) 
    } 

    func func2() { 
     print(someVar2) 
    } 
} 


func foo(with object: P1) { 
    object.func1() 

    if let object = object as? P2 { 
     object.func2() 
    } 
} 

print("Test case 1:") 
foo(with: C1()) 
print("Test case 1:\n") 
foo(with: C2()) 
関連する問題