Swift中属性和变量之间有什么区别?

时间:2015-11-20 22:39:24

标签: ios swift

从几个初始教程中,我看到属性属于一个类,并且基本上是C ++世界中使用的“全局变量”(在此前编码)。我还将变量视为更多只在方法中使用/存储信息的“本地”实体。

然后我遇到了这个Quora帖子:https://www.quora.com/Apple-Swift-programming-language/What-is-the-difference-between-a-property-and-a-variable 现在我看到属性能够执行与其调用相关的代码。这非常酷,但也为我打开了一大堆其他问题。

还有其他简单明了的方法来记住属性和变量之间的区别吗?

3 个答案:

答案 0 :(得分:7)

属性属于对象,而变量则不属于对象。可以声明变量而不必与特定类或其他对象相关联。属性必须与特定对象相关联(即:类,枚举或结构)

答案 1 :(得分:6)

局部变量只是您使用的东西。你可以完全控制这些,如果你在一个函数中改变一个变量,你的函数之外的任何东西都不会知道。如果我编写一个框架并且你使用它,并且我决定改变函数的局部变量,那么使用我的框架的应用程序将继续工作,就像没有任何改变一样。

另一方面,课程描述了一份合同。当您使用课程时,您可以访问他们公开宣传的所有内容。这意味着如果我编写一个框架并且你使用它,如果我更改或删除了一个类的公共成员,如果你以前使用该成员,你的代码将会中断。

出于这个原因,在许多语言中,将实例变量标记为公共是不好的做法。没有附加逻辑的实例变量,如果我想在某个时刻在某个字段被更改时触发某些内容,或者我想完全删除该字段(而是在子对象中报告某个值),那么我就是我坚持改变公共合同(例如,用一对get / set方法改变字段),并可能破坏你的代码。

由于这个原因,Swift使属性成为间接。 Swift属性可以被视为大部分的哑值,但是如果您需要从存储值更改为计算值或其他值,则可以在不更改类的接口的情况下执行此操作。这样,您就不会破坏依赖于该属性的现有代码。

答案 2 :(得分:0)

[Swift types]

variable-地址的命名存储。每个变量都有一个定义内存大小,属性和行为的类型

快速变量和常量

constantvariable,但定义后不能不能进行修改。

//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 observerswillSetdidSet

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 propertyComputed property

var closureStoredPropery: String = {
    return "Hello World!"
}()
  • closure stored property被调用一次,并且可以在初始化后更改(如果它是var
  • 每次调用
  • Computed property时都会计算一次

[Java variable, property...]