2016-07-16 2 views
0

In meinen beiden Klassen, ich habe den folgenden CodeWie generische Swift-Funktion erstellen, die für 2 verschiedene Klassen funktionieren kann?

// Two classes who's code I am trying to reduce using protocols 
class class1 { 
    var view: viewSubclass1! 
    func printName() { 
     print("This is the view: \(view)") 
    } 
} 

class class2 { 
    var view: viewSubclass2! 
    func printName() { 
     print("This is the view: \(view)") 
    } 
} 

// The protocol and protocol extension I am trying to create 
protocol myProtocol { 
    var view: UIView {get set} 
    func printName() 
} 

extension myProtocol { 
    func printName() { 
     print("This is the view: \(view)") 
    } 
} 

// The subviews of UIView 
class viewSubclass1: UIView {} 
class viewSubclass2: UIView {} 

Wie Sie sehen können, class1 und class2 verschiedene Klassen sind, aber den gleichen Variablenname: view und die gleichen Funktionsnamen. Der Unterschied besteht darin, dass die Variablen view unterschiedliche Typen sind.

Frage: Wie kann ich mithilfe von Protokollen und Protokollerweiterungen den Code zwischen den beiden Klassen reduzieren? Ich möchte nicht wiederholen Code, weil sie so ähnlich sind. Ich habe verschiedene Varianten des Codes versucht, aber ich bleibe stecken. Ich verstehe es nicht gut. Wie kann ich beide Klassen verwenden, um den gleichen Code mit einem Protokoll und einer Protokollerweiterung zu verwenden?

Antwort

1

(aktualisiert)

mit dem Protokoll und Protokollerweiterung erklärt:

protocol MyProtocol { 
    associatedtype BaseView: UIView 
    var view: BaseView! {get set} 
    func printName() 
} 

extension MyProtocol { 
    func printName() { 
     print("This is the view: \(view)") 
    } 
} 

Und da zwei Unterklassen von UIView:

class ViewSubclass1: UIView {} 
class ViewSubclass2: UIView {} 

(Aktivierte einige Typnamen für die Lesbarkeit .)

Und erklärt zwei Klassen wie folgt aus:

class Class1: MyProtocol { 
    var view: ViewSubclass1! 
} 

class Class2: MyProtocol { 
    var view: ViewSubclass2! 
} 

Sie finden Sie Ihre printName() sowohl für Class1 und Class2 verwenden können.

Eine Sache wichtig:

Wenn Sie Ihre view im Protokoll als var view: UIView {get set} erklären, var view: ViewSubclass1! kann nicht die Anforderung für das Protokoll erfüllen. (Eine Sache ist der Unterschied von Optionalität, ein anderer ist, dass Sie keine Instanzen von UIView oder UIView ‚s Subklassen view: ViewSubclass1 zuweisen können.)

Aber viele Dinge davon abhängen, was Sie wirklich wollen, in Ihrem gemeinsamen Code zu tun.

+0

Ich habe meine Frage bearbeitet. Der erste war ein Durcheinander. Ich habe versucht, es einfacher zu machen. –

+0

@JTAppleCalendarforiOSSwift, ok, ich werde meine Antwort später aktualisieren. – OOPer

Verwandte Themen