子类与协议

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

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

您想要值类型语义(结构和协议)还是需要引用类型语义(类和协议)。 我通常默认使用值类型语义,因为它们更安全但是肯定存在引用类型语义很重要的情况。 您可以在此处阅读更多相关信息: 为什么选择Struct over Class 。

快速接受或接受

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

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

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

您有一组希望某些对象遵循的规则,制定协议。

如果要创建具有function的对象,并且希望子级具有此function的固有特性,然后具有更多function,那么请执行inheret类结构。

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

这将通过类而不是协议来完成

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

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

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

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

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

为什么选择Struct Over Class?