1. 소개
속성은 값을 클래스, 구조체 및 열거형과 연결합니다. Swift의 속성은 저장 속성과 계산 속성의 두 가지 유형으로 구분됩니다. 저장 속성은 값을 저장하는 데 사용되며 클래스 및 구조체에만 사용할 수 있습니다. 열거.
2. 저장소 속성
저장소 속성은 값을 저장하기 위해 변수나 상수를 사용합니다. can 구성 예는 점 구문을 통해 속성에 액세스할 수 있는 것입니다.
struct MyStruct { var property1 = 1 var property2:Int } var obj = MyStruct(property1: 1, property2: 2) //通过点语法进行属性的访问 print(obj.property1,obj.property2)
위 구조와 같이 속성이 let 상수로 선언되면 해당 속성을 수정할 수 없습니다. 또 한 가지 주의할 점은 구조체의 인스턴스를 생성할 때 let을 사용하면 구조체의 속성이 변수이더라도 수정할 수 없다는 점입니다. 이것은 수업과는 매우 다릅니다.
지연된 저장 속성이라는 저장 속성 유형도 있습니다. 클래스의 모든 인스턴스 후에 클래스의 일부 속성이 사용되지 않고 일부 속성의 구성이 A를 소비할 수 있는 상황을 상상할 수 있습니다. 많은 경우, 현 시점에서 현명한 설계는 클래스가 인스턴스화될 때 이러한 유형의 속성이 구성되지 않는다는 것입니다. 서브클래스의 인스턴스가 이 속성을 사용할 때 이러한 속성을 지연된 저장이라고 합니다. 게으른 키워드를 사용하여 선언되며
//第一个类 class MyClass1 { init(){ print("MyClass1类被构造") } } class MyClass2 { //声明为延时存储属性 lazy var body = MyClass1() } //在构造MyClass2时 并不会进行body属性的构造 不会有打印信息 var obj2 = MyClass2() //执行下面代码后 会有打印信息 使用body属性使得body被构造 obj2.body
참고로 지연된 생성 속성이 여러 스레드에서 실행되는 경우에는 한 번만 생성된다는 보장은 없습니다.
3. 계산된 속성
계산된 속성은 값을 저장하는 데 사용되는 독립적인 속성이 아니라는 점을 간단히 이해하면 됩니다. 주로 계산을 통해 다른 저장된 속성의 값을 얻거나 설정하는 데 사용됩니다. 예시는 다음과 같습니다.
struct Circle { //圆心 var center:(Double,Double) //半径 var r:Double //周长 将其作为计算属性 var l:Double{ get{ //计算圆的周长 return 2.0*r*M_PI } set{ //通过周长重新计算半径 默认传入的参数名为newValue r = newValue/(M_PI*2) } } } var circle = Circle(center: (0,0), r: 2) print(circle.l) circle.l=24 print(circle.r)
위 데모 코드에서 볼 수 있듯이 l 속성은 새로운 속성이 아니지만, l 속성을 통해 계산됩니다. r 속성 또는 l을 통해 r을 공제합니다. 한 가지 주목할 점은 계산된 속성에서 두 개의 코드 블록(set 및 get)을 생성할 수 있다는 것입니다. set 코드 블록은 선택 사항이며 전달하기 위해 newValue 매개 변수가 기본적으로 생성됩니다. get 코드 블록을 구현해야 합니다. 물론 get 코드 블록만 구현할 수도 있습니다. 이 경우 이 속성은 가져오기만 가능한 읽기 전용 계산 속성이 됩니다. 설정할 수 없습니다. 또 한 가지 주목할 점은 개발자가 외부에서 전달된 매개변수를 수신하기 위해 설정된 코드 블록 뒤에 매개변수 이름을 사용자 정의할 수도 있다는 것입니다. 예는 다음과 같습니다.
struct Circle { //圆心 var center:(Double,Double) //半径 var r:Double //周长 将其作为计算属性 var l:Double{ get{ //计算圆的周长 return 2.0*r*M_PI } set(newL){ //通过周长重新计算半径 默认传入的参数名为newValue r = newL/(M_PI*2) } } }
읽기 전용 계산 속성은 설정된 코드 블록이 없기 때문에 키워드 get 및 괄호도 모호함 없이 생략할 수 있습니다. 예는 다음과 같습니다.
struct Point { var x:Double var y:Double var center:(Double,Double){ return (x/2,y/2) } }
4. 속성 리스너
Swift의 계산된 속성에 있는 get 및 set 메서드와 Objective-C의 get 및 set 메서드는 실제로 동일하지 않습니다. Objective-C는 속성을 얻거나 설정하려고 할 때 개발자가 일부 사용자 정의 작업을 수행할 수 있도록 하는 설정 및 가져오기 메서드를 제공합니다. 개발 요구 사항 중 이 부분은 속성 리스너를 통해 Swift에서 구현됩니다.
속성 리스너에는 willSet과 didSet 두 가지 유형이 있는데, willSet은 속성 값이 변경되려고 할 때 실행되고, didSet은 속성 값이 변경되었을 때 실행되며, 그 이전과 이후의 값은 다음과 같습니다. 변경사항이 전달됩니다. 예는 다음과 같습니다.
struct Point { var x:Double var y:Double{ willSet{ print("将要进行值的更新设置,新的值是:",newValue) } didSet{ print("已经进行值得更新设置,旧的值是:",oldValue) } } var center:(Double,Double){ return (x/2,y/2) } } var point = Point(x: 3, y: 3) //将打印 /* 将要进行值的更新设置,新的值是: 4.0 已经进行值得更新设置,旧的值是: 3.0 */ point.y=4
WillSet은 기본적으로 newValue라는 매개변수를 생성하고, didSet은 기본적으로 oldValue라는 매개변수를 생성합니다. 이러한 매개변수의 이름은 다음과 같습니다.
struct Point { var x:Double var y:Double{ willSet(new){ print("将要进行值的更新设置,新的值是:",new) } didSet(old){ print("已经进行值得更新设置,旧的值是:",old) } } var center:(Double,Double){ return (x/2,y/2) } }
5. 인스턴스 속성 및 유형 속성
인스턴스 속성은 유형의 인스턴스를 위한 것입니다. 유형 속성은 유형을 직접 참조합니다. 한 쌍의 유형이 인스턴스화될 때마다 해당 인스턴스는 독립적인 인스턴스 속성 세트를 가지며 Objective-C에서는 일반적으로 전역 속성을 사용하여 이 효과를 얻습니다. 유형 속성을 선언하려면 static 키워드를 사용하십시오. 예는 다음과 같습니다.
struct Point { //类型存储属性 static var name:String = "Point" //类型计算属性 static var subName:String{ return "sub"+name } var x:Double var y:Double{ willSet(new){ print("将要进行值的更新设置,新的值是:",new) } didSet(old){ print("已经进行值得更新设置,旧的值是:",old) } } var center:(Double,Double){ return (x/2,y/2) } } //类型属性 通过类型点语法来获取 print(Point.name,Point.subName)
클래스 유형에 대한 속성을 계산하는 특별한 경우가 있습니다. . 하위 클래스에 의한 상속 및 재작성이 필요하고 static 키워드를 class 키워드로 바꿔야 합니다. 예는 다음과 같습니다:
class SomeClass { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 27 } //支持子类进行重写的计算属性 class var overrideableComputedTypeProperty: Int { return 107 } }