Swift에서 'get'과 'set'은 무엇입니까?


101

저는 Swift를 배우고 The Swift Programming Language있으며 Apple에서 읽고 있으며 Objective C 배경이 없습니다 (PHP, JS 및 기타 만 있지만 Obj C는 없음).

24-25 페이지에 다음 코드가 표시됩니다.

//...Class definition stuff...

var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
}

//...Class continues...

이 부분은 책에 명시되어 있지 않으며 그 내용을 알 수 없습니다.

누구든지 얻을 수 있고 설정 하는 것이 무엇인지 설명 할 수 있습니까 ?


2
getter / setter에 대해 21 페이지를 읽었습니까? 또한 처음 30 페이지 정도는 전체 문서가 아닌 Swift 둘러보기 입니다.
vol7ron

C ++를 수행했다면이 항목을 클래스의 getter 및 setter 멤버 함수와 함께 연결할 수 있습니다.
CodingOnSteroid

답변:


38

실제로 코드 바로 앞에 설명되어 있습니다.

저장되는 단순 속성 외에도 속성에는 getter 및 setter가있을 수 있습니다.

class EquilateralTriangle: NamedShape {
    ...

다른 클래스가 해당 경계 변수를 얻으려고 할 때 다음을 수행합니다.

let someVar = myTriangle.perimeter

... 이것은 다음과 같습니다.

get{
    return 3.0 * self.sideLength
}

따라서 기본적으로 호출하는 컨트롤러가 다음을 수행 한 것과 같습니다.

let someVar = 3.0 * myTriangle.sideLength

다른 개체에서 변수 를 설정 하면 다음과 같습니다.

myTriangle.perimeter = 100

set{}블록 의 코드를 호출합니다 .

set {
    sideLength = newValue / 3.0
}

따라서 변수를 설정하는 클래스가 다음을 수행 한 것과 같습니다.

myTriangle.sideLength = 100/3.0

정말 편리 합니다. 항상 3으로 나누거나 곱할 필요없이 다른 코드에서 이것을 호출 할 수 있습니다. 왜냐하면 변수를 설정하기 직전과 변수를 얻기 직전에 이루어지기 때문입니다.

Swift에서 우리는 얻을 때 계산되고 설정 될 때 뭔가를 할 수있는 속성을 가질 수 있습니다. Objective-C에서도이 작업을 수행 할 수 있습니다.

// .h
@property (nonatomic) double perimeter;

//.m

- (double)perimeter
{
    return self.sideLength * 3.0;
}
- (void)setPerimeter:(double)perimeter
{
    self.perimeter = perimeter; // In Swift, this is done automatically.
    self.sideLength = perimeter / 3.0;
}

108

클래스 내에서 변수를 가져오고 설정하는 것은 내용을 검색 ( "가져 오기")하거나 변경 ( "설정")하는 것을 말합니다.

members클래스 의 변수 를 고려하십시오 family. 당연히이 변수는 정수가되어야합니다. 가족은 사람이 2 점으로 구성 될 수 없기 때문입니다.

따라서 다음 members과 같이 변수 를 정의하여 진행할 수 있습니다 .

class family {
   var members:Int
}

그러나 이것은이 클래스를 사용하는 사람들에게 가족 수를 0 또는 1과 같이 설정할 수있는 가능성을 줄 것입니다. 그리고 1 또는 0의 가족이 없기 때문에 이것은 매우 불행한 일입니다.

이것이 getter와 setter가 들어오는 곳입니다. 이렇게하면 변수를 변경할 수있는 방법과받을 수있는 값은 물론 반환되는 내용을 결정할 수 있습니다.

가족 수업으로 돌아가서 아무도 members값을 2보다 작은 값으로 설정할 수 없도록합시다 .

class family {
  var _members:Int = 2
  var members:Int {
   get {
     return _members
   }
   set (newVal) {
     if newVal >= 2 {
       _members = newVal
     } else {
       println('error: cannot have family with less than 2 members')
     }
   }
  }
}

이제 members를 입력하여 이전과 같이 변수에 액세스 할 수 있으며 instanceOfFamily.members, setter 함수 덕분에 예를 들어 다음을 입력하여 이전과 같이 값을 설정할 수도 있습니다 instanceOfFamily.members = 3. 그러나 변경된 것은이 변수를 더 이상 2보다 작은 값으로 설정할 수 없다는 사실입니다.

setter 함수를 _members통해 설정 한 값을 저장하는 실제 변수 인 변수 의 도입에 유의하십시오 members. 원본 members은 이제 계산 된 속성이되었습니다. 즉, 실제 변수를 처리하는 인터페이스 역할 만합니다.


members==> count, numberOfMembers; var members : Set<Person>??
GoZoner

1
set (newVal) { ... }, newVal이 내포되어 있으므로 set { _members = newVal }정확합니다.
AndreasHassing

4
다음과 같은 변수에 유의하십시오. _members 는 private이어야합니다. 그렇지 않으면 명령 instanceOfFamily._members=1instanceOfFamily.members2 미만의 값으로 설정 됩니다
Daniel

기본 매개 변수의 이름이 지정된 것 같습니다. newValue - 스위프트 4 docs.swift.org/swift-book/LanguageGuide/Properties.html#ID260
놀란 에이미

18

간단한 질문 다음에는 짧고 간단하며 명확한 답변이 있어야합니다.

  • 우리가 속성의 가치를 얻을 때 그것은 그 get{}부분을 발사합니다 .

  • 속성에 값을 설정하면 해당 set{}부분이 실행됩니다.

추신. 속성에 값을 설정할 때 SWIFT는 설정중인 값인 "newValue"라는 상수를 자동으로 생성합니다. 속성 set{}부분 에서 상수 "newValue"에 액세스 할 수있게 된 후 .

예:

var A:Int = 0
var B:Int = 0

var C:Int {
get {return 1}
set {print("Recived new value", newValue, " and stored into 'B' ")
     B = newValue
     }
}

//When we are getting a value of C it fires get{} part of C property
A = C 
A            //Now A = 1

//When we are setting a value to C it fires set{} part of C property
C = 2
B            //Now B = 2

1
구성원이 클래스 외부에서 액세스 할 수 있도록 기본값을 지정해야합니다. 내가 그것에 대한 기본값을 할당 할 때이 문제가 수정되었습니다 class UserBean : NSObject {var user_id : String? = nil} 다음과 같이 액세스하면 let user : UserBean = UserBean () user.user_id = "23232332"
Amr Angry

1

계산 된 속성을 봐야합니다.

코드 샘플 perimeter에서은 (는) 클래스 변수에 의해 백업되지 않은 속성입니다. 대신 해당 값은 get메서드를 사용하여 계산 되고 set메서드 (일반적으로 gettersetter 라고 함)를 통해 저장됩니다 .

다음과 같이 해당 속성을 사용할 때 :

var cp = myClass.perimeter

get코드 블록에 포함 된 코드를 호출하고 다음과 같이 사용할 때 :

myClass.perimeter = 5.0

할당 연산자의 오른쪽에 제공된 값으로 자동으로 채워지는 set코드 블록에 포함 된 코드를 호출합니다 newValue.

계산 된 속성은 getter와 setter가 모두 지정된 경우 readwrite가되고 getter 만 지정된 경우 readonly 일 수 있습니다.


0

변수는 클래스에서 이렇게 선언하고 호출합니다.

class X {
    var x: Int = 3

}
var y = X()
print("value of x is: ", y.x)

//value of x is:  3

이제 x의 기본값이 3보다 크거나 같도록 프로그래밍하려고합니다. 이제 x가 3보다 작 으면 가상의 경우를 가정하면 프로그램이 실패합니다. 따라서 사람들이 3 개 이상을 입력하기를 원합니다. Swift는 쉽게 사용할 수 있으며 iOS 개발에 광범위하게 사용되기 때문에 변수 값을 연대 측정하는이 비트 어드밴스 방식을 이해하는 것이 중요합니다. 이제 여기서 get 및 set가 사용되는 방법을 살펴 보겠습니다.

class X {
    var _x: Int = 3
    var x: Int {
        get {
            return _x
        }
        set(newVal) {  //set always take 1 argument
            if newVal >= 3 {
             _x = newVal //updating _x with the input value by the user
            print("new value is: ", _x)
            }
            else {
                print("error must be greater than 3")
            }
        }
    }
}
let y = X()
y.x = 1
print(y.x) //error must be greater than 3
y.x = 8 // //new value is: 8

여전히 의심이가는 경우 get 및 set의 사용은 업데이트하려는 방식으로 변수를 업데이트하는 것임을 기억하십시오. get 및 set를 사용하면 논리를 더 잘 제어 할 수 있습니다. 강력한 도구이므로 쉽게 이해할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.