신속한 프로그래밍: 저장된 속성의 getter/setter
Swift에서 저장된 속성의 설정자를 덮어쓰려면 어떻게 해야 합니까?
Obj-C에서는 세터를 덮어쓸 수 있지만 Swift는 저장된 속성에 게터/세터가 사용되는 것에 만족하지 않는 것 같습니다.
나한테 있다고 해주세요.Card
속성이 다음과 같은 클래스rank
클라이언트가 잘못된 값을 제공하지 않기를 원하므로 목표-C에서 덮어쓸 수 있습니다.setRank
추가 검사를 수행하도록 합니다.willSet
스위프트에서는 도움이 되지 않는 것 같습니다.newValue
일정하며 할당하는 것은 의미가 없습니다.rank
왜냐하면 세터는 루프에서 호출되기 때문입니다.
좋습니다. 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
위해서willSet
그리고.oldValue
위해서didSet
아니면 당신이 직접 이름을 지을 수 있습니다.willSet(newTotalSteps)
.
get 및 set는 계산된 속성에 대한 것입니다(백업 저장소가 없음).(내 생각에는, 여기서 키워드 'var'는 혼란스럽습니다)
- 인스턴스 변수에 대해 willSet 및 didSet이 호출됩니다(변경 내용을 재정의하려면 UsedidSet을 사용합니다).
- set 및 get은 순전히 계산된 속성을 위한 것입니다.
속성 값이 일시적으로 잘못되었다는 문제가 있는 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
}
}
단순화된 예:
class Shape {
var sideLength: Double {
get {
return self.sideLength
}
set {
// Implement the setter here.
self.sideLength = newValue
}
}
}
전체 예
체크아웃perimeter
이 예에서는
발췌: Apple Inc."스위프트 프로그래밍 언어" 아이북스.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' 카테고리의 다른 글
Ajax 응답 내부에 반환된 js 파일 실행 (0) | 2023.08.23 |
---|---|
open()에서 FileNotFoundError / IOError: '[Errno 2] 해당 파일 또는 디렉터리가 없습니다.' (0) | 2023.08.23 |
Mercurial 폴더를 Git 저장소로 변환 (0) | 2023.08.23 |
MySql: 열을 표시하지만 필드 이름을 제외한 모든 항목 제외 (0) | 2023.08.23 |
콘솔에서 대화형으로 값 읽기 (0) | 2023.08.18 |