Swift Language
변수 및 속성
수색…
비고
변수 만들기
var
, name, type 및 value에 이어 새로운 변수를 선언하십시오.
var num: Int = 10
변수의 값을 변경할 수 있습니다.
num = 20 // num now equals 20
그들이 let
정의되지 않는 한 :
let num: Int = 10 // num cannot change
Swift는 변수 유형을 추측하므로 항상 변수 유형을 선언 할 필요는 없습니다.
let ten = 10 // num is an Int
let pi = 3.14 // pi is a Double
let floatPi: Float = 3.14 // floatPi is a Float
변수 이름은 글자와 숫자로 제한되지 않으며 일부 제한 사항이 있지만 대부분의 다른 유니 코드 문자도 포함 할 수 있습니다.
상수 및 변수 이름에는 공백 문자, 수학 기호, 화살표, 개인 사용 (또는 유효하지 않은) 유니 코드 코드 또는 줄 및 상자 그리기 문자를 포함 할 수 없습니다. 그들은 숫자로 시작할 수도 없습니다.
var π: Double = 3.14159
var 🍎🍏: String = "Apples"
속성 기본 사항
클래스 또는 구조체에 속성을 추가 할 수 있습니다 (기술적으로 enum 도 있습니다, "계산 된 속성"예제 참조). 클래스 / 구조체의 인스턴스와 연관된 값을 추가합니다.
class Dog {
var name = ""
}
위의 경우 Dog
인스턴스에는 String
유형의 name
이라는 속성이 있습니다. 이 속성은 Dog
인스턴스에서 액세스하고 수정할 수 있습니다.
let myDog = Dog()
myDog.name = "Doggy" // myDog's name is now "Doggy"
이러한 유형의 속성은 객체에 무언가를 저장하고 메모리에 영향을주기 때문에 저장된 속성으로 간주 됩니다 .
게으른 저장 프로퍼티
지연 저장된 속성에는 처음 액세스 할 때까지 계산되지 않은 값이 있습니다. 이것은 변수의 계산이 계산적으로 비용이 많이들 때 메모리 절약에 유용합니다. 게으른 속성으로 lazy
속성을 선언합니다.
lazy var veryExpensiveVariable = expensiveMethod()
종종 closure의 반환 값에 할당됩니다.
lazy var veryExpensiveString = { () -> String in
var str = expensiveStrFetch()
str.expensiveManipulation(integer: arc4random_uniform(5))
return str
}()
지연 저장된 속성은 var
로 선언해야합니다.
계산 된 속성
저장된 속성과는 달리 계산 된 속성 은 getter 및 setter로 작성되어 액세스 및 설정시 필요한 코드를 수행합니다. 계산 된 속성은 유형을 정의해야합니다.
var pi = 3.14
class Circle {
var radius = 0.0
var circumference: Double {
get {
return pi * radius * 2
}
set {
radius = newValue / pi / 2
}
}
}
let circle = Circle()
circle.radius = 1
print(circle.circumference) // Prints "6.28"
circle.circumference = 14
print(circle.radius) // Prints "2.229..."
읽기 전용 계산 속성은 여전히 var
:
var circumference: Double {
get {
return pi * radius * 2
}
}
읽기 전용으로 계산 된 속성을 축소하여 get
을 제외 할 수 있습니다.
var circumference: Double {
return pi * radius * 2
}
지역 변수 및 전역 변수
지역 변수는 함수, 메소드 또는 클로저 내에 정의됩니다.
func printSomething() {
let localString = "I'm local!"
print(localString)
}
func printSomethingAgain() {
print(localString) // error
}
전역 변수는 함수, 메서드 또는 클로저 외부에서 정의되며 형식 내에서 정의되지 않습니다 (모든 대괄호 밖에서 생각하십시오). 그들은 어디서나 사용할 수 있습니다 :
let globalString = "I'm global!"
print(globalString)
func useGlobalString() {
print(globalString) // works!
}
for i in 0..<2 {
print(globalString) // works!
}
class GlobalStringUser {
var computeGlobalString {
return globalString // works!
}
}
전역 변수는 느리게 정의됩니다 ( "지연 등록 정보"예 참조).
유형 특성
유형 특성은 유형 자체의 특성이지 인스턴스가 아닌 특성입니다. 저장되거나 계산 된 속성이 될 수 있습니다. static
으로 type 속성을 선언합니다.
struct Dog {
static var noise = "Bark!"
}
print(Dog.noise) // Prints "Bark!"
클래스에서는 static
대신 class
키워드를 사용하여 재정의 할 수 있습니다. 그러나 계산 된 속성에만 적용 할 수 있습니다.
class Animal {
class var noise: String {
return "Animal noise!"
}
}
class Pig: Animal {
override class var noise: String {
return "Oink oink!"
}
}
이것은 싱글 톤 패턴 과 함께 자주 사용됩니다.
부동산 옵서버
속성 관찰자는 속성 값의 변경에 응답합니다.
var myProperty = 5 {
willSet {
print("Will set to \(newValue). It was previously \(myProperty)")
}
didSet {
print("Did set to \(myProperty). It was previously \(oldValue)")
}
}
myProperty = 6
// prints: Will set to 6, It was previously 5
// prints: Did set to 6. It was previously 5
-
myProperty
가 설정 되기 전에willSet
가 호출됩니다. 새 값은newValue
로 사용할 수 있으며 이전 값은myProperty
로 계속 사용할 수 있습니다. -
didSet
은myProperty
가 설정된 후에 호출됩니다. 이전 값은oldValue
로 사용할 수 있으며 새 값은 이제myProperty
사용할 수 있습니다.
주 :
didSet
및willSet
는 다음과 같은 경우 호출되지 않습니다.
- 초기 값 지정
- 자체 내에서 변수를 수정
didSet
또는willSet
-
didSet
및willSet
의oldValue
및newValue
에 대한 매개 변수 이름을 선언하여 가독성을 높일 수도 있습니다.
var myFontSize = 10 {
willSet(newFontSize) {
print("Will set font to \(newFontSize), it was \(myFontSize)")
}
didSet(oldFontSize) {
print("Did set font to \(myFontSize), it was \(oldFontSize)")
}
}
주의 : setter 매개 변수 이름을 선언하는 것이 지원되지만 이름을 섞어 사용하지 않도록 조심해야합니다.
willSet(oldValue)
및didSet(newValue)
는 완전히 합법적이지만 코드 독자를 상당히 혼란스럽게합니다.