Swift 프로그래밍 : 저장된 속성의 getter / setter
Swift에서 저장된 속성의 setter를 어떻게 덮어 쓰나요?
Obj-C에서는 setter를 덮어 쓸 수 있지만 Swift는 저장된 속성에 사용되는 getter / setter에 만족하지 않는 것 같습니다.
Card
라는 속성 이있는 클래스가 있다고 가정 해 보겠습니다 rank
. 클라이언트가 잘못된 값을 제공하지 않기를 원하므로 Objective-C에서 덮어 써서 setRank
추가 검사를 수행 할 수 있습니다 . 그러나 willSet
Swift에서는 newValue
상수 이기 때문에 도움이되지 않는 것 같고 rank
setter가 루프에서 호출되기 때문에 할당하는 것은 의미가 없습니다 .
확인. Swift에 대한 Apple 문서를 읽으면서 다음을 발견 했습니다 .
자신의 didSet 관찰자 내의 속성에 값을 할당하면 할당 한 새 값이 방금 설정 한 값을 대체합니다.
그래서 당신이해야 할 일은 다음과 같습니다.
var rank: Int = 0 {
didSet {
// Say 1000 is not good for you and 999 is the maximum you want to be stored there
if rank >= 1000 {
rank = 999
}
}
}
저장된 속성에 대해 get
/ set
를 재정의 할 수는 없지만 속성 관찰자 willSet
/를 사용할 수 있습니다 didSet
.
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
println("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
println("Added \(totalSteps - oldValue) steps")
}
}
}
기본 매개 변수 이름은 newValue
for willSet
및 oldValue
for didSet
이거나 에서 와 같이 직접 이름을 지정할 수 있습니다 willSet(newTotalSteps)
.
속성 값이 일시적으로 잘못되었다는 문제가있는 didSet을 사용하지 않으려면 계산 된 속성을 그 주위에 래핑해야합니다.
private var _foo:Int = 0
var foo:Int {
get {
return _foo
}
set {
if(newValue > 999) {
_foo = 999
} else {
_foo = newValue
}
}
}
또는:
private var _foo:Int = 0
var foo:Int {
get {
return _foo
}
set {
guard newValue <= 999 else {
_foo = 999
return
}
_foo = newValue
}
}
get 및 set는 계산 된 속성 용입니다 (백업 저장소가 없음). (제 생각에는 'var'라는 키워드가 여기에서 혼란 스럽습니다)
- willSet 및 didSet은 인스턴스 변수에 대해 호출됩니다 (변경 사항을 무시하려면 didSet 사용)
- set and get are purely for computed properties
Simplified Example:
class Shape {
var sideLength: Double {
get {
return self.sideLength
}
set {
// Implement the setter here.
self.sideLength = newValue
}
}
}
Full example
Check out perimeter
in this example.
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/us/jEUH0.l
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triagle with sides of length \(sideLength)."
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength”
참고URL : https://stackoverflow.com/questions/24114732/swift-programming-getter-setter-in-stored-property
'Programing' 카테고리의 다른 글
Android Emulator에서 WiFi 활성화 (0) | 2020.08.16 |
---|---|
IntelliJ-오류가있는 위치 표시 (0) | 2020.08.16 |
.NET 용 SFTP 라이브러리 (0) | 2020.08.16 |
@Mock, @MockBean 및 Mockito.mock ()의 차이점 (0) | 2020.08.16 |
Adb 기기에서 내 휴대 전화를 찾을 수 없음 (0) | 2020.08.16 |