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更有意义,以便您可以轻松地复制它们并使用它们进行计算或修改值而不用担心副作用.
Dur*_*nat 55
类和结构都可以做到:
只有班级才能做到:
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)
类是引用类型.这意味着如果将类的实例分配给变量,它将仅包含对实例的引用而不包含副本.
以上答案是正确的,我希望我的答案能对不了解上述答案的人有所帮助。
在Swift中有两种类型的对象
它们之间的主要区别是
例如,这里的代码很好理解。
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)
这是主要区别,但我们也有一些区别。
类
结构
这个问题似乎是重复的,但无论如何,以下内容将回答大部分用例:
结构和类之间最重要的区别之一是结构是值类型,并且在代码中传递时总是被复制,类是引用类型并通过引用传递.
此外,类具有继承,允许一个类继承另一个类的特性.
结构属性存储在堆栈上,而类实例存储在堆上,因此有时堆栈比类快得多.
Struct自动获取默认初始值设定项,而在Class中,我们必须初始化.
Struct在任何时候都是线程安全的或单独的.
而且,为了总结结构和类之间的区别,有必要理解值和引用类型之间的区别.
// 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)
Swift 类型
Value type是一种类型,其值在分配给变量或常量、传递给函数或从函数返回时被复制。(也as和is检查制作结构的副本)
Reference types当它们被分配给一个变量或常量,或者当它们被传递给一个函数时不会被复制
值类型:
Struct, Enum[关于] , Tuple
struct String, struct Array( Set, Dictionary)
String和内置的收藏价值类型包含内部基准来heap管理它的大小
value type一个新的数据副本时被创建。实际上copy on write-COW机制与一些优化一起使用,例如在修改对象时创建副本参考类型:
Class,Function
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 结构】
| 归档时间: |
|
| 查看次数: |
70572 次 |
| 最近记录: |