快速语言中的结构与类

Man*_*wal 184 swift

来自Apple的书"结构和类之间最重要的区别之一是结构在代码中传递时总是被复制,但类是通过引用传递的."

任何人都可以让我理解这意味着什么,对我来说,类和结构似乎是一样的.

Ale*_*yne 458

这是一个例子class.请注意,如果更改名称,则更新两个变量引用的实例.Bob现在Sue,无处不在的地方Bob.

class SomeClass {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var aClass = SomeClass(name: "Bob")
var bClass = aClass // aClass and bClass now reference the same instance!
bClass.name = "Sue"

println(aClass.name) // "Sue"
println(bClass.name) // "Sue"
Run Code Online (Sandbox Code Playgroud)

现在,struct我们看到值被复制,每个变量都保留了它自己的一组值.当我们将名称设置为时Sue,Bobstruct in aStruct不会被更改.

struct SomeStruct {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var aStruct = SomeStruct(name: "Bob")
var bStruct = aStruct // aStruct and bStruct are two structs with the same value!
bStruct.name = "Sue"

println(aStruct.name) // "Bob"
println(bStruct.name) // "Sue"
Run Code Online (Sandbox Code Playgroud)

因此,为了表示有状态的复杂实体,a class非常棒.但是对于仅仅是测量或相关数据位的值,struct更有意义,以便您可以轻松地复制它们并使用它们进行计算或修改值而不用担心副作用.

  • @MichaelRapadas数字实际上是*在Swift中的*结构. (5认同)

Dur*_*nat 55

类和结构都可以做到:

  • 定义存储值的属性
  • 定义提供功能的方法
  • 延长
  • 符合协议
  • 定义intialisers
  • 定义下标以提供对其变量的访问

只有班级才能做到:

  • 遗产
  • 类型铸造
  • 定义deinitialisers
  • 允许多个引用的引用计数.


ash*_*elu 29

struct是价值类型.这意味着如果将结构的实例复制到另一个变量,它只是复制到变量.

值类型的示例

struct Resolution {
    var width = 2
    var height = 3
}

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd //assigning struct instance  to variable
println("Width of cinema instance is \(cinema.width)")//result is 1920
println("Width of hd instance is \(hd.width)")//result is 1920

cinema.width = 2048

println("Width of cinema instance is \(cinema.width)")//result is 2048
println("Width of hd instance is \(hd.width)")//result is 1920
Run Code Online (Sandbox Code Playgroud)

类是引用类型.这意味着如果将类的实例分配给变量,它将仅包含对实例的引用而不包含副本.

  • +1表示"如果将类的实例分配给另一个变量,它将只保留实例的引用而不是复制." (5认同)

dar*_*ara 7

以上答案是正确的,我希望我的答案能对不了解上述答案的人有所帮助。

在Swift中有两种类型的对象

  1. 结构

它们之间的主要区别是

  • 结构是类型
  • 类是引用类型

例如,这里的代码很好理解。

struct SomeStruct {
var a : Int;

init(_ a : Int) {
    self.a = a
}
}

class SomeClass {
var a: Int;

init(_ a: Int) {
    self.a = a
}

}
var x = 11

var someStruct1 = SomeStruct(x)
var someClass1 = SomeClass(x)

var someStruct2 = someStruct1
var someClass2 = someClass1

someClass1.a = 12
someClass2.a // answer is 12 because it is referencing to class 1     property a

someStruct1.a = 14
someStruct2.a // answer is 11 because it is just copying it not referencing it
Run Code Online (Sandbox Code Playgroud)

这是主要区别,但我们也有一些区别。

  1. 必须声明初始化程序(构造函数)
  2. 有去初始化器
  3. 可以继承其他类

结构

  1. 它为您提供免费的初始化程序,如果您执行免费的初始化程序,则不必声明初始化程序,否则声明的初始化程序将覆盖该初始化程序
  2. 没有反初始化器
  3. 无法从其他结构继承


DIL*_*URI 7

这个问题似乎是重复的,但无论如何,以下内容将回答大部分用例:

  1. 结构和类之间最重要的区别之一是结构是值类型,并且在代码中传递时总是被复制,类是引用类型并通过引用传递.

  2. 此外,类具有继承,允许一个类继承另一个类的特性.

  3. 结构属性存储在堆栈上,而类实例存储在堆上,因此有时堆栈比类快得多.

  4. Struct自动获取默认初始值设定项,而在Class中,我们必须初始化.

  5. Struct在任何时候都是线程安全的或单独的.

而且,为了总结结构和类之间的区别,有必要理解值和引用类型之间的区别.

  1. 复制值类型时,它会将您要复制的事物中的所有数据复制到新变量中.它们是两个独立的东西,改变一个不影响另一个.
  2. 制作引用类型的副本时,新变量引用与要复制的内容相同的内存位置.这意味着更改一个将更改另一个,因为它们都指向相同的内存位置.以下示例代码可以作为参考.

// sampleplayground.playground

  class MyClass {
        var myName: String
        init(myName: String){
            self.myName = myName;
        }
    }

    var myClassExistingName = MyClass(myName: "DILIP")
    var myClassNewName = myClassExistingName
    myClassNewName.myName = "John"


    print("Current Name: ",myClassExistingName.myName)
    print("Modified Name", myClassNewName.myName)

    print("*************************")

    struct myStruct {
        var programmeType: String
        init(programmeType: String){
            self.programmeType = programmeType
        }
    }

    var myStructExistingValue = myStruct(programmeType: "Animation")
    var myStructNewValue = myStructExistingValue
    myStructNewValue.programmeType = "Thriller"

    print("myStructExistingValue: ", myStructExistingValue.programmeType)
    print("myStructNewValue: ", myStructNewValue.programmeType)
Run Code Online (Sandbox Code Playgroud)

输出:

Current Name:  John
Modified Name John
*************************
myStructExistingValue:  Animation
myStructNewValue:  Thriller
Run Code Online (Sandbox Code Playgroud)


yoA*_*ex5 5

Swift 类型

Value type是一种类型,其值在分配给变量或常量、传递给函数或从函数返回时被复制。(也asis检查制作结构的副本)

Reference types 当它们被分配给一个变量或常量,或者当它们被传递给一个函数时不会被复制

值类型:
Struct, Enum[关于] , Tuple
struct String, struct Array( Set, Dictionary)

String和内置的收藏价值类型包含内部基准heap管理它的大小

  • 当您分配或传递 value type一个新的数据副本时被创建。实际上copy on write-COW机制与一些优化一起使用,例如在修改对象时创建副本
  • 当您修改实例时,它仅具有局部效果。
  • 通常情况下,堆栈存储器是用来[公司]

参考类型
ClassFunction

ARC 用来

  • 当您分配或传递对原始实例reference type新引用时,将创建(复制实例的地址)。
  • 当您修改一个实例时,它具有全局效果,因为该实例由指向它的任何引用共享和访问。
  • 一般的堆内存使用[关于]

在此处输入图片说明

Value type建议默认使用。最大的优点Value type是通常它们是thread safe

Reference type 优点:

  • 它们可以被继承,
  • deinit() 可以使用,
  • 通过引用比较实例===
  • Objective-C互操作性,因为Value Type是在 Swift 中引入的。

【栈 vs 堆】
【let vs var,class vs struct】
【类 vs 结构】

在结构和类之间选择
类型
类和结构