从几个初始教程中,我看到属性属于一个类,并且基本上是C ++世界中使用的“全局变量”(在此前编码)。我还将变量视为更多只在方法中使用/存储信息的“本地”实体。
然后我遇到了这个Quora帖子:https://www.quora.com/Apple-Swift-programming-language/What-is-the-difference-between-a-property-and-a-variable 现在我看到属性能够执行与其调用相关的代码。这非常酷,但也为我打开了一大堆其他问题。
还有其他简单明了的方法来记住属性和变量之间的区别吗?
答案 0 :(得分:7)
属性属于对象,而变量则不属于对象。可以声明变量而不必与特定类或其他对象相关联。属性必须与特定对象相关联(即:类,枚举或结构)
答案 1 :(得分:6)
局部变量只是您使用的东西。你可以完全控制这些,如果你在一个函数中改变一个变量,你的函数之外的任何东西都不会知道。如果我编写一个框架并且你使用它,并且我决定改变函数的局部变量,那么使用我的框架的应用程序将继续工作,就像没有任何改变一样。
另一方面,课程描述了一份合同。当您使用课程时,您可以访问他们公开宣传的所有内容。这意味着如果我编写一个框架并且你使用它,如果我更改或删除了一个类的公共成员,如果你以前使用该成员,你的代码将会中断。出于这个原因,在许多语言中,将实例变量标记为公共是不好的做法。没有附加逻辑的实例变量,如果我想在某个时刻在某个字段被更改时触发某些内容,或者我想完全删除该字段(而是在子对象中报告某个值),那么我就是我坚持改变公共合同(例如,用一对get
/ set
方法改变字段),并可能破坏你的代码。
由于这个原因,Swift使属性成为间接。 Swift属性可以被视为大部分的哑值,但是如果您需要从存储值更改为计算值或其他值,则可以在不更改类的接口的情况下执行此操作。这样,您就不会破坏依赖于该属性的现有代码。
答案 2 :(得分:0)
variable
-地址的命名存储。每个变量都有一个定义内存大小,属性和行为的类型
快速变量和常量
constant
是variable
,但定义后不能不能进行修改。
//definition
var <name> = <initial_value>
//type annotation
var <name>: <Swift_type> [= <initial_value>] // [] is optional
//var - variable
var myVariable1 = 11
var myVariable2: Int
myVariable2 = 12
//let - constant
let myConstant1 = 21
let myConstant2: Int
myConstant2 = 22
全局变量和局部变量
全局变量是在函数,类之外定义的变量。 局部变量是:类型上下文(类,结构,枚举)[About]中的变量,函数内部的函数参数
属性
property
-将值与类型上下文相关联。它是一个变量+有界的getter/setter
存储的属性和计算的属性
它们可以属于instance(instance property
)或type(type property
):
Stored property
(类,结构)
Computed property
(类,结构,枚举)
Stored property
-是类型上下文中的local variable
->变量。 Swift存储的属性不像Objective-C一样支持instance variable
。
var
let
它支持property observers
(willSet
,didSet
)
closure stored property
-自定义值[Example]
Computed property
-提供getter
和可选的setter
,以便每次都计算一个值
public class Person {
var firstName = "John"
var lastName = "Wick"
var fullNameComputedProperty: String {
get {
return "\(firstName) \(lastName)"
}
//optional
set {
let arr = newValue.split(separator: " ")
firstName = String(arr[0])
lastName = String(arr[1])
}
}
var addressStoredProperty: String {
//Property Observers
willSet {
print("old address:\(addressStoredProperty)")
print("new address:\(newValue)")
//addressStoredProperty is not updated yet
}
didSet {
print("old address:\(oldValue)")
print("new address:\(addressStoredProperty)")
}
}
}
closure stored property
与Computed property
var closureStoredPropery: String = {
return "Hello World!"
}()
closure stored property
被调用一次,并且可以在初始化后更改(如果它是var
)Computed property
时都会计算一次