什么是Enum,Structs,Classes之间的区别

时间:2016-02-02 11:06:07

标签: swift

所以我一直在网上研究,我找不到这三个的简单定义。我知道An Enum和Struct可以包含属性,初始化器和方法,并且这两个数据结构也都通过' value'传递,但那几乎就是它......

我想知道,这3个(Enum,Structs,Classes)有什么区别?在每个最简单的定义?

3 个答案:

答案 0 :(得分:8)

我认为Chris Upjohn对树屋中的主题提供了一个相当简单但很好的解释:

枚举

enum 被视为结构化数据类型,无需在您的内容中多次更改说出 String Int 即可进行修改例如,下面的代码显示了意外更改内容并忘记将其更改为其他地方是多么容易。

let myString = "test"

if myString == "ttest" {
  // Doesn't execute because "ttest" is the value assigned to "myString"
}

使用enum,我们可以避免这种情况,并且永远不必担心不止一次更改同一件事。

enum MyEnum: String {
  case Test = "test"
}

let enumValue = MyEnum.Test

if enumValue == MyEnum.Test {
  // Will execute because we can reassign the value of "MyEnum.Test" unless we do so within "MyEnum"
}

的Structs

我不确定你对MVC模式有多了解,但在Swift中,这是一种常见的做法,在我解释结构是如何有用之前我将在Swift中快速概述MVC。 / p>

模型 - struct ,对于管理大量数据非常有用 查看 - 任何扩展 UIView 的内容,通常情况下,这是您在故事板上管理的控制器
控制器 - ,通常仅用于 UIView 控制器和 UITableView 等视图

正如我所说,移动一个结构用于管理大量数据,例如,人类是一个很好的例子,因为我们可以使用结构来管理联系人列表中的每个人。

struct Birthday {
  var day: Int
  var month: Int
  var year: Double
}

struct Person {
  var firstName: String
  var lastName: String
  var birthday: Birthday
  var phoneNumber: String
  var emailAddress: Int
}

对于您拥有的每个联系人,您将创建一个新的 Person 对象,其中包含基本详细信息以及 Birthday 结构,以实现完全可重用性,使用的好处生日结构是我们可以扩展它而不破坏我们的代码的事实,例如,如果我们需要一种简单的方法来格式化人的生日,我们可以添加一个额外的功能而不影响我们的其余代码。

<强>类

通常情况下,您只会找到绑定视图的类,当绑定到视图时,只要调用视图,iOS就会自动分配该类的新实例,第二次调用视图时,它会请求已创建的实例上课。

类的其他用途是实用程序帮助程序,您可以将其创建为单例,这更像是一个高级概念,通常您只需要在较大的应用程序上创建这样的代码,因为通常您需要的所有内容都已内置但是它和#39;如果您确实需要使用扩展名的其他功能,则建议您添加到任何内置对象并创建自己的下标。

免责声明:以下文字属于Chris Upjohn。我无法用Swift解释它(可能在一般的CS术语中,使用其他语言),因此我没有看到任何重写类似于此的点。

希望它有所帮助!

答案 1 :(得分:1)

<强>枚举吗

枚举代表有限数量的&#34;状态为&#34;。与许多其他语言中的枚举不同,它们不是存在状态的属性(例如,用作指定一个或多个最终变为整数或一起的标志的代理)。

enum StartuUpError : ErrorType{
    case ShowStoppingBug(bugid: Int)
    case TooManyDistractions
    case NotEnoughTime
    case NotEnoughFunding(shortFall: Int)
}

使用:

enum StartuUpError : ErrorType{
    case ShowStoppingBug(bugid: Int)
    case TooManyDistractions
    case NotEnoughTime
    case NotEnoughFunding(shortFall: Int)
}
class Startup {
    var funding = 0
    var completion = 0
    var burnRate = 10000
    var week = 0

    func raiseCapital(amount: Int){
        funding += amount
    }
    func completeWork(units: Int) throws{
        week += units
        funding -= burnRate

        if funding < 0{
           throw StartuUpError.NotEnoughFunding(shortFall: funding)
        }
        if completion >= 100{
            print("Congratulations! You've been achieved! ")
        }
    }

}
let myStrtup = Startup()
myStrtup.raiseCapital(25000)

do{
    let weeklyWOrk = 20
    for _ in 1...3{
        try myStrtup.completeWork(weeklyWOrk)
        print("At week \(myStrtup.week), tried to do \(weeklyWOrk) uits of work")
    }
}catch{
    if let error = error as? StartuUpError{
        switch error{
        case  .NotEnoughFunding(let shortFall):
            print("Ran out of funding! ShortFall:\(shortFall)")
        default:
            print("Some other problem")

        }
    }
}

<强> STRUCT吗

struct基本上是一个基类型。它无法扩展,虽然可以对其执行功能,但它们只应提供有关该类型的其他信息。简而言之,它是由属性集合(可以是常量或变量)定义的类型

struct slidingDoor : Door{
    var isLocked : Bool = false

    func open() {
        print("Whoooshh")
    }
    func close() {
        print("whooosh")
    }
    var description : String{
        return "Smooth sliding door"
    }
}

使用

class BankValut : Door{
    var isLocked : Bool = true

    func open() {
        if isLocked{
          print("Locked !")
        }else{
            print("Clang!")
        }

    }
    func close() {
        print("Slamm")
        isLocked = true
    }
    func unlock(combination : String){
        isLocked = false
    }
    var description: String {
        if isLocked {
            return "A bank vault that is locked"
        } else {
            return "An unlocked bank vault"
        }
    }
}

let door1 = slidingDoor()
door1.open(

<强>类吗

也许事情变得更容易了。如果没有其他人可以使用,请使用这个!但是,我认为这里有一些特征对于构建一个可以利用所有这些语言支持类型的好处的优秀OO模型非常重要

有关详细说明Refer this

答案 2 :(得分:0)

  
      
  1. 枚举由有限数量的案例之一初始化,完全由其案例定义,并且应始终为有效实例   实例化时的情况
  2.         

    2.当没有有限数量的有效实例(例如枚举案例)且结构也不构成时,应使用2.structs   完整定义对象,而不是对象的属性

         

    3.A类完全定义对象模型中的主要角色,包括其属性及其交互。

可以通过继承扩展类。类中的方法可能会被重载或稍后实现。

More Here

This是一篇较早的帖子,解释了enum和struct之间的差异: