2016-11-15 28 views
0

我想知道如何使用協議在下面抽象class.Given的地方是,我想使用協議,迅速實現與抽象類寫的情景:swift:如何使用協議來代替抽象類?

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

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

我想要實現上述在swift中使用協議的功能。 任何幫助將不勝感激。

+0

'協議MODELA { VAR產品數量的:int {得到設定} VAR PRODUCTURL:字符串{被置} } 類ModelB:MODELA { VAR產品數量的:int = 10 變種PRODUCTURL:字符串=「一些URl「 }' –

回答

1

下面是一個簡單的例子,也爲更多的細節,你可以看看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) 
    } 
} 

|

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

從我讀的協議工作作爲接口在swift.But迫使我在派生類中實現所有的屬性或函數。如果我想在一個派生類中的一些屬性和一些在另一個派生類中的屬性?我可以使用抽象類來實現。 – Ankit0047

+0

在Swift中,你不能在協議中擁有可選的屬性或方法,但是你可以通過使其符合@objc來聲明(更多信息請訪問 - https://devforums.apple.com/message/994834#994834)。如果你想使用類1中的一些屬性和類2中的一些屬性,那麼這些屬性不應該在協議中聲明,或者只是指定一些默認值並且不要使用它們。 –

+0

以你的例子爲例,如果我在Shape協議中有另一個稱爲radius的變量,並且有一個Circle類,它實現了用於計算面積和周長的形狀,而Circle類只需要半徑既不是寬度也不是高度。我應該如何實現?因爲使用可選屬性是不推薦的,所以我不能使用它。 – Ankit0047

1

協議的實現應該是:

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

「我想在這裏訪問MODELA成員」,其實你已經在ModelB來實現ModelA性能。否則,你會得到一個編譯錯誤說法:

enter image description here

ModelB:

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 
    } 
} 

更多有關協議,檢查Apple Documentation

0

,你可以這樣寫:

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

然後從蘋果文檔的一類

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

使用它:

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

您可以定義可選要求對於協議,這些要求不需要通過符合協議的類型來實現。 可選要求以可選修飾符作爲協議定義的一部分 的前綴。可選的需求是可用的,因此您可以編寫可與Objective-C互操作的代碼 。必須使用@objc 屬性標記 協議和可選要求。請注意,@objc協議只能由繼承自Objective-C類或其他@objc類的類 採用。他們 不能被結構或枚舉採用。

但說實話,它如果你想真正讓你的代碼清楚不是真的是最好的辦法。抽象類沒有明確定義誰將實現功能。我不知道你最終想達到什麼目的,但是可能的擴展可能會幫助你爲某些類添加函數,而無需在協議之前在協議中定義它們。