수색…


비고

속성 : 형식과 연결됨

변수 : 유형과 연관되지 않음

자세한 내용은 Swift Programming Language iBook 을 참조하십시오.

변수 만들기

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

변수 이름은 글자와 숫자로 제한되지 않으며 일부 제한 사항이 있지만 대부분의 다른 유니 코드 문자도 포함 할 수 있습니다.

상수 및 변수 이름에는 공백 문자, 수학 기호, 화살표, 개인 사용 (또는 유효하지 않은) 유니 코드 코드 또는 줄 및 상자 그리기 문자를 포함 할 수 없습니다. 그들은 숫자로 시작할 수도 없습니다.

소스 developer.apple.com

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 로 계속 사용할 수 있습니다.
  • didSetmyProperty 가 설정된 후에 호출됩니다. 이전 값은 oldValue 로 사용할 수 있으며 새 값은 이제 myProperty 사용할 수 있습니다.

주 : didSetwillSet 는 다음과 같은 경우 호출되지 않습니다.

  • 초기 값 지정
  • 자체 내에서 변수를 수정 didSet 또는 willSet
  • didSetwillSetoldValuenewValue 에 대한 매개 변수 이름을 선언하여 가독성을 높일 수도 있습니다.
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) 는 완전히 합법적이지만 코드 독자를 상당히 혼란스럽게합니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow