>  기사  >  백엔드 개발  >  Swift의 속성 선언 및 기능

Swift의 속성 선언 및 기능

高洛峰
高洛峰원래의
2017-03-01 13:37:331252검색

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
  }
}


Swift의 속성 선언 및 기능과 관련된 더 많은 글은 PHP 중국어 홈페이지를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.