[Swift🦩] #10パーセント
1. Stored Property ⭐️
保存された定数、変数.
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // 0, 1, 2
rangeOfThreeItems.firstValue = 6 // 6, 7, 8
let rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // 0, 1, 2
rangeOfThreeItems.firstValue = 6 // let 으로 선언했기 때문에 불가능.
// 하지만 class 라면? 가능.
// rangeOfThreeItems = FixedLengthRange(firstRange: 1, elength: 4) 처럼
// 아예 새로운 변수를 할당하는 것은 불가능.
lazy
使用前に初期値を計算しないプログラム.
初期化が完了しても初期値がない場合がありますので、varとして宣言する必要があります.letと宣言した場合、初期化前に値を持たなければならないため、遅延することはできません.
lazy var tableView: UITableView = {
let v = UITableView()
v.register(UITableViewCell.self, reuseIdentifier: "cell")
v.delegate = self
v.dataSource = self
return v
}()
2. Computed Property ⭐️⭐️
実際に値を保存するのではなく、別のプロパティの値を間接的に取得して設定します.getter, setter
let start = 0
var end = 10
var mid {
get { return (start + end) / 2 }
// set(newMid) { end = 2 * newMid }
set { end = 2 * newValue } // 자동 제공.
}
var readOnlyMid {
return (start + end) / 2
}
3. Property Observer ⭐️⭐️
propertyの値が変化しているかどうかを観察し、応答します.
新しい値が現在の値と同じであっても、propertyで値を設定したときに呼び出されます.
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
+)willSet、didSetで宣言されたpropertyをパラメータとしてinout関数に渡すと、値は常に新しく上書きされるため、関数の終了時にすべてのwillSet didSetが呼び出されます.4. Property Wrapper ❓
実際に格納された値と管理値の値を分離する方法の1つです.ロジックが頻繁に使用され、再利用性がある場合は、このように管理します.
@구조체이름
のキーワードを付けます.@propertyWrapper
struct TwelveOrLess {
private var number = 0
// number 에 직접 접근 X, wrappedValue 를 통한 접근만 가능.
var wrappedValue: Int {
get { return number }
set { number = min(newValue, 12) }
}
}
struct SmallRectangle {
// 가로 세로가 모두 12 이하인지 확인.
@TwelveOrLess var height: Int
@TwelveOrLess var width: Int
}
// 같은 역할을 하는 코드이지만 wrapping 을 이렇게 할수도 있음.
struct SmallRectangle {
private var _height = TwelveOrLess()
private var _width = TwelveOrLess()
var height: Int {
get { return _height.wrappedValue }
set { _height.wrappedValue = newValue }
}
var width: Int {
get { return _width.wrappedValue }
set { _width.wrappedValue = newValue }
}
}
init for property wrapping
初期文字はpropertyパッケージを使用するコードで定義および使用できます.
@propertyWrapper
struct SmallNumber {
private var maximum: Int
private var number: Int
var wrappedValue: Int {
get { return number }
set { number = min(newValue, maximum) }
}
init() {
maximum = 12
number = 0
}
init(wrappedValue: Int) {
maximum = 12
number = min(wrappedValue, maximum)
}
init(wrappedValue: Int, maximum: Int) {
self.maximum = maximum
number = min(wrappedValue, maximum)
}
}
struct ZeroRectangle {
@SmallNumber var height: Int // init 사용
@SmallNumber var width: Int = 1 // init(wrappedValue: ) 사용
// init(wrappedValue: maximum: ) 사용
@SmallNumber(wrappedValue: 3, maximum: 10) var height2: Int
@SmallNumber(maximum: 9) var width2: Int = 2
}
var zeroRectangle = ZeroRectangle()
print(zeroRectangle.height, zeroRectangle.width)
// Prints "0 0"
投影値
保存する値の変化を目的の値に投影して使用できます.
@propertyWrapper
struct SmallNumber {
private var number: Int
private(set) var projectedValue: Bool
// number 가 큰 값인지에 대한 Bool 값으로 number 를 투영.
var wrappedValue: Int {
get { return number }
set {
if newValue > 12 {
number = 12
projectedValue = true
} else {
number = newValue
projectedValue = false
}
}
}
init() {
self.number = 0
self.projectedValue = false
}
}
struct SomeStructure {
@SmallNumber var someNumber: Int
}
var someStructure = SomeStructure()
// $변수명 으로 투영된 변수 값에 접근할 수 있다.
someStructure.someNumber = 4
print(someStructure.$someNumber)
// Prints "false"
someStructure.someNumber = 55
print(someStructure.$someNumber)
// Prints "true"
->しかし、最終的には包装価値に近いはずですが、投影価値にどのように近づくか...?wrappedValue, projectedValue
というキーワード自体がpropertyrappingで提供されていると思います->presenterでは、外部ではsubjectをasobserverとasobserverとして使用し、重複が多いため、この構文を使用することが望ましい.
5.全域、地域
グローバル定数、変数は常に不活性で計算されます.
6. Type Property ⭐️
各インスタンスで生成されるプロファイルとは異なり、1つのタイプで作成されるプロファイルです.
常にデフォルト値を与え、基本的にlazyで操作します.
ストレージ/コンピューティングプロファイルとして定義可能
定義した文の前に静的キーワードを付けます.
struct UserInfo {
static var uuid: String {
return UUID().uuidString
}
static var name: String = "초기값"
}
print(UserInfo.uuid)
+)enumはstructよりもよく使われています.インスタンスを作成せずに使用します.enumは初期化者がいないから!!n.問題
property包装器について説明します。
https://bbiguduk.gitbook.io/swift/language-guide-1/properties
Reference
この問題について([Swift🦩] #10パーセント), 我々は、より多くの情報をここで見つけました https://velog.io/@ddosang/Swift-10-프로퍼티テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol