子类化vs协议

时间:2015-11-04 15:04:39

标签: ios swift macos protocols

让我们从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
}
}

我只需要知道哪一个更像Swift?

3 个答案:

答案 0 :(得分:2)

快速接受或接受。

以下是您希望与两者区别开来的方法。

使用Protocols时,您希望将它们视为对象的蓝色打印。

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.

这可以通过类来完成,而不是使用协议

答案 1 :(得分:2)

最终,这些方法都不是“更加迅捷”。在Swift中,有时您会想要使用继承,有时您会想要使用协议。这两种方法的真正决定点是:

您是否需要值类型语义(结构和协议),还是需要引用类型语义(类和协议)。我通常默认使用值类型语义,因为它们更安全但是肯定存在引用类型语义很重要的情况。您可以在此处详细了解:Why Choose Struct over Class

答案 2 :(得分:1)

结构实例始终按值传递,类实例始终通过引用传递。这意味着它们适用于不同类型的任务。在考虑项目所需的数据结构和功能时,请确定是将每个数据结构定义为类还是结构。

作为一般准则,请考虑在满足以下一个或多个条件时创建结构:

该结构的主要目的是封装一些相对简单的数据值。 当您分配或传递该结构的实例时,期望复制封装的值而不是引用是合理的。 结构存储的任何属性本身都是值类型,也可以复制而不是引用它们。 该结构不需要从另一个现有类型继承属性或行为。 结构的良好候选者的例子包括:

  
      
  • 几何形状的大小,可能封装了width属性和height属性,两者都是Double。
  •   
  • 一种引用系列中范围的方法,可能封装了一个类型为Int的起始属性和长度属性。
  •   
  • 3D坐标系中的一个点,可能包含x,y和z属性,每个属性为Double。
  •   
     

在所有其他情况下,定义一个类,并创建该类的实例   通过引用进行管理和传递。在实践中,这意味着   大多数自定义数据结构应该是类,而不是结构。

Why Choose Struct Over Class?