2015-11-04 72 views
3

讓與Class方式開始:子類別訴訟協議

class LoginCredentials { 

    var id : String 

    init(userID:String) { 
     self.id = userID 
    } 
} 

的,我們將有以下幾點:

class FacebookLoginCredentials : LoginCredentials { 

var token : String 
init(userID:String,userToken:String) { 

    self.token = userToken  
    super.init(userID: userID) 
}} 

而且

class TwitterLoginCredentials : LoginCredentials { 
var token : String 
var secret : String 
init(userID:String,userToken:String,secret : String) { 

    self.token = userToken 
    self.secret = secret 
    super.init(userID: userID) 
} 
} 

第二種方法是Protocol Oriented如果我沒有錯

protocol LoginCredentials { 

    var id : String { get } 
} 

那麼我們將有:

struct FacebookLoginCredentials : LoginCredentials { 

var id: String 
var token : String 
init(userID:String,userToken:String) { 

    self.id = userID 
    self.token = userToken 
} 
} 

而且

struct TwitterLoginProfile : LoginCredentials { 
var id: String 
var token : String 
var secret : String 

init(userID:String,userToken:String,secret : String) { 

    self.token = userToken 
    self.secret = secret 
    self.id = userID 
} 
} 

我只需要知道哪一個更斯威夫特?

+0

協議主要用於授權。在我看來,這裏的子類是更好的選擇。 – milo526

+0

@ milo526協議遠不只用於委派。這是一種非常「客觀的」方式來看待事物。我鼓勵你觀看https://developer.apple.com/videos/play/wwdc2015-408/或閱讀http://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2 – drewag

回答

2

最終,這些方法都不是 「更雨燕」。在Swift中,你有時會想要使用繼承,而其他時候則需要使用協議。這兩種方法的真正決策點是:

你想要值類型的語義(結構和協議)還是你想引用類型的語義(類和協議)。我通常默認使用值類型語義,因爲它們更安全,但肯定有引用類型語義很重要的情況。你可以在這裏閱讀更多關於:Why Choose Struct over Class

0

無論是還是可以接受的迅速。

下面是你想如何區分兩者。

使用協議時,您希望將它們看作是對象的藍色印記。

Ballplayers must know what a ball is, so any person that wants to be a Ballplayer must know what a ball is.

你有一套你想某些對象跟隨,做一個協議規則。

如果您想要使對象具有功能,並且希望孩子固有此功能,然後擁有更多功能,請執行inheret類結構。

Dad can throw a ball at 100MPH Junior can throw a ball at 100MPH and throw a curve ball.

這將有一個類,而不是協議

+0

這個答案似乎沒有包含任何關於協議擴展的想法。它仍然可以爲協議添加功能,但它不能使用繼承。 – drewag

+0

這是因爲擴展協議超出協議的範圍,這就是爲什麼它在擴展中完成 – Knight0fDragon

0

結構實例總是按值傳遞,和類實例總是通過引用傳遞來完成。這意味着它們適合於不同類型的任務。在考慮項目所需的數據結構和功能時,請確定每個數據結構是應該定義爲類還是結構。

作爲一般原則,考慮創建一個結構,當一個或多個條件適用於:

結構的主要目的是封裝一些相對簡單的數據值。 當分配或傳遞該結構的實例時,期望封裝值將被複制而不是引用是合理的。 結構存儲的任何屬性都是它們自己的值類型,也可能會被複制而不是引用。 該結構不需要繼承其他現有類型的屬性或行爲。良好候選結構的 實例包括:

  • 幾何形狀的尺寸,或許封裝width屬性和height屬性,兩個型雙。
  • 一種引用一系列範圍內的範圍的方法,可能封裝一個類型爲Int的start屬性和一個length屬性。
  • 3D座標系中的一個點,可能是封裝了x,y和z屬性,每個屬性都是Double類型。

在所有其他情況下,定義一個類,並創建要通過引用進行管理和傳遞的類 的實例。實際上,這意味着大多數自定義數據結構應該是類而不是結構。

Why Choose Struct Over Class?