2016-07-12 11 views
0

現在、私は1つのプロジェクトに取り組んでいます。以下のような複数のコントローラにコードが重複している可能性があります。コントローラに重複コードがあります


コントローラA

class A: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 
    // about 50~70 lines of codes 
    @IBAction func scanButtonTapped { 
     // used self (as AVCaptureMetadataOutputObjectsDelegate) 
     // used view 
     // called presentViewController(...), which is a func in UIViewController 
    } 
} 

コントローラB

class B: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 
    @IBAction func scanButtonTapped { 
     // will need same logic as in Controller A 
    } 
} 

私の現在のソリューションは、別のクラスCを有しており、それに複製コードを移動しています。しかし、私がそうした場合、コントローラーはAVCaptureMetadataOutputObjectsDelegateにキャストできますが、UIViewControllerにはキャストできません。

class C { 
    func btnTapped (view: UIView, controller: AnyClass) { 
     // logic is here 
     // controller can cast to AVCaptureMetadataOutputObjectsDelegate 
     // but controller cannot cast to UIViewController 
    } 
} 

ので、AとBは、UIViewControllerにコントローラをキャストすることが可能であるならば私の質問がある

class A { 
    @IBAction func scanButtonTapped { 
     let c = C() 
     c.btnTapped(view, self) 
    } 
} 

を持つことになります。または、コードを適切にリファクタリングする別の方法がありますか?

+0

なぜあなたは 'クラスCを行ういけない:その後のUIViewController、AVCaptureMetadataOutputObjectsDelegate {...}'と 'クラスA:C {'と 'クラスB:C {' ? – luk2302

答えて

2

AVCaptureMetadataOutputObjectsDelegateプロトコルを拡張し、プロトコル拡張(POPアプローチ)によるデフォルト実装を作成することはどうですか?

protocol ScanButtonClickable: AVCaptureMetadataOutputObjectsDelegate { 
    func btnTapped() // this line is optional 
} 

extension Clickable where Self: UIViewController { 
    func btnTapped() { 
     // logic is here 
    } 
} 

class A: UIViewController, ButtonClickable { 
... 
} 

class B: UIViewController, ButtonClickable { 
... 
} 
+0

ありがとう、JMI。それは非常に有用です。 – Jimmy

0

これを試してみてください:

//declare your default method to be used across classes 
protocol MyProtocol { 
    func myFunc() 
} 

//provide the implementation of your default behavior here in myFunc() 
extension MyProtocol { 
    func myFunc() { 
     print("Default behavior") 
} 
} 

class A: MyProtocol { 

} 

class B: MyProtocol { 

} 

let a = A() 
a.myFunc() 

let b = B() 
b.myFunc() 

//prints 
Default behavior 
Default behavior 
関連する問題