2016-11-15 3 views
0

Ich wollte wissen, wie ich Protokolle an die Stelle der abstrakten class.Given unter dem Szenario mit abstrakten Klasse verwenden können, die i-Protokolle in swift mit implementieren möchten geschrieben ist:swift: Wie verwendet man Protokolle anstelle der abstrakten Klasse?

public abstract class ModelA 
{ 
    protected int productQuantity; 
    protected String productUrl; 
} 

class ModelB extends ModelA 
{ 
    // I want to access ModelA members here 
} 

ich die oben implementieren möchten Funktionalität mit Protokollen in swift. Jede Hilfe wird geschätzt.

+0

'Protokoll ModelA { var productQuantity: Int {Set erhalten} var PRODUCTURL: String {fertig} } Klasse Modell B: ModelA { var productQuantity: Int = 10 var PRODUCTURL: String =„Einige URl " }' –

Antwort

1

Hier ist ein einfaches Beispiel und auch mehr Details für Sie bei Apple Docs

protocol Shape { 
    var width: Double { get set} 
    var height: Double { get set} 
    func area() -> Double 
    func perimeter() -> Double 
} 

class Rectangle:Shape 
{ 
    var width: Double 
    var height: Double 

    init() 
    { 
     width = 0.0 
     height = 0.0 
    } 
    convenience init(width:Double, height:Double) 
    { 
     self.init() 
     self.width = width 
     self.height = height 
    } 
    func area() -> Double { 
     return width * height 
    } 

    func perimeter() -> Double { 
     return 2 * (width + height) 
    } 
} 

schauen |

var rect = Rectangle(width: 5.0, height: 5.0) 
    print(rect.area()) 
    print(rect.perimeter()) 

    rect = Rectangle() 
    print(rect.area()) 
    print(rect.perimeter()) 

    rect.width = 10 
    rect.height = 10 
    print(rect.area()) 
    print(rect.perimeter()) 
+0

Von dem, was ich Protokoll als Schnittstelle in swift.Lesen gelesen habe, zwingt mich, alle Eigenschaften oder Funktionen in der abgeleiteten Klasse zu implementieren.Was, wenn ich einige der Eigenschaften in einer abgeleiteten Klasse und einige wollen Eigenschaften in einer anderen abgeleiteten Klasse, die ich mit der abstrakten Klasse erreichen kann. – Ankit0047

+0

In Swift können Sie keine optionale Eigenschaft oder Methode im Protokoll haben, jedoch können Sie dies durch Objc-Konformität mit @objc deklarieren (Weitere Informationen finden Sie unter - https://devforums.apple.com/message/994834#994834). Wenn Sie einige der Eigenschaften in der Klasse 1 und einige in der Klasse 2 verwenden möchten, bedeutet dies entweder, dass diese Eigenschaften nicht im Protokoll deklariert werden sollen oder nur einen Standardwert vergeben und diese nicht verwenden. –

+0

Nehmen wir Ihr Beispiel zum Beispiel, wenn ich eine andere Variable namens Radius im Shape-Protokoll und eine Klasse Circle, die Form zur Berechnung von Fläche und Umfang und Circle Klasse erfordert nur Radius weder Breite noch Höhe erfordert. Wie soll ich das implementieren? Da die Verwendung einer optionalen Eigenschaft nicht empfohlen wird, kann ich diese nicht verwenden. – Ankit0047

1

Die Umsetzung des Protokolls sollte sein:

protocol ModelA { 
    // props 
    var productQuantity: Int { get set } 
    var productUrl:String { get set } 
} 

"Ich hier ModelA Mitglieder zugreifen möchten", Sie ModelA Eigenschaften in ModelB zu implementieren tatsächlich haben. Andernfalls werden Sie einen Compiler-Fehler Spruch erhalten:

enter image description here

Modell B:

class ModelB: ModelA { 
    // default values 
    var productQuantity: Int = 0 
    var productUrl: String = "" 

    // you can remove the default values after implementing 'init': 
    init(productQuantity: Int, productUrl: String) { 
     self.productQuantity = productQuantity 
     self.productUrl = productUrl 
    } 
} 

Weitere Informationen zum Protokoll, überprüfen Apple Documentation.

0

Sie können schreiben:

@objc protocol modelA 
{ 
    @objc optional productQuantity:Int { get set } 
    @objc optional productUrl:String { get set } 
} 

Und es dann in einer Klasse verwenden

class ModelB: ModelA { 
    // you can implement OR NOT the attributes here 
} 

aus Apfel doc:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

Sie optionale Anforderungen definieren für Protokolle, diese Anforderungen ts müssen nicht durch Typen implementiert werden, die dem Protokoll entsprechen. Den optionalen Anforderungen wird der optionale Modifizierer als Teil der Protokolldefinition vorangestellt. Optionale Anforderungen sind verfügbar, sodass Sie Code schreiben können, der mit Objective-C interagiert. Sowohl das Protokoll als auch die optionale Anforderung müssen mit dem Attribut @objc gekennzeichnet sein. Beachten Sie, dass @objc-Protokolle nur von Klassen übernommen werden können, die von Objective-C-Klassen oder anderen @objc-Klassen erben. Sie können nicht von Strukturen oder Aufzählungen übernommen werden.

Aber ehrlich gesagt, es ist nicht wirklich der beste Ansatz, wenn Sie wirklich Ihren Code klar halten wollen. Abstrakte Klassen definieren nicht klar, wer Funktionen implementieren wird oder nicht. Ich weiß nicht, was Sie am Ende erreichen wollen, aber Erweiterungen könnten Ihnen helfen, Funktionen zu einigen Klassen hinzuzufügen, ohne sie vorher in einem Protokoll definieren zu müssen.

Verwandte Themen