수색…


구조체의 기초

struct Repository {
    let identifier: Int
    let name: String
    var description: String?
}

이것은 3 개의 저장 프로퍼티, 정수 identifier , 문자열 name , 선택적인 문자열 description 가진 Repository 구조체를 정의합니다. identifiernamelet 키워드를 사용하여 선언되었으므로 상수입니다. 초기화 중에 설정되면 수정할 수 없습니다. 설명은 변수입니다. 수정하면 구조 값이 업데이트됩니다.

구조체 유형은 고유 한 사용자 정의 초기화 기가 정의되어 있지 않으면 Memberwise Initializer를 자동으로받습니다. 기본 값이없는 속성이 저장된 경우에도 구조체는 memberwise 이니셜 라이저를받습니다.

Repository 에는 description 만 기본값 ( nil )을 갖는 세 개의 저장된 특성이 들어 있습니다. 더 나아가 그것 자체의 이니셜 라이저를 정의하지 않으므로, 멤버 전용 이니셜 라이저를 무료로받습니다 :

let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")

구조체는 값 유형입니다.

참조로 전달되는 클래스와 달리 구조는 복사를 통해 전달됩니다.

first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"

문자열은 구조이므로 할당시 복사됩니다.

구조는 ID 연산자를 사용하여 비교할 수도 없습니다.

window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands

두 개의 구조 인스턴스는 모두 동일하다고 간주하면 동일하게 간주됩니다.

집합 적으로, 클래스와 구조를 구별하는 이러한 특성은 구조 값 유형을 만드는 요소입니다.

구조체 돌연변이

struct 자체의 값을 변경하는 struct의 메소드는 mutating 키워드를 접두어로 사용해야합니다

struct Counter {
    private var value = 0
    
    mutating func next() {
        value += 1
    }
}

당신이 돌연변이 방법을 사용할 수있을 때

mutating 방법은 변수 내부의 구조체 값에서만 사용할 수 있습니다.

var counter = Counter()
counter.next()

당신이 돌연변이 방법을 사용할 수 없을 때

반면에, mutating 메소드는 상수 내의 struct 값에는 사용할 수 없습니다.

let counter = Counter()
counter.next()
//  error: cannot use mutating member on immutable value: 'counter' is a 'let' constant

구조체는 상속받을 수 없습니다.

클래스와 달리 구조는 상속받을 수 없습니다.

class MyView: NSView { }  // works

struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'

그러나 구조는 프로토콜을 채택 할 수 있습니다.

struct Vector: Hashable { ... }  // works

구조체의 멤버에 액세스하기

Swift에서 구조는 간단한 "도트 구문"을 사용하여 멤버에 액세스합니다.

예 :

struct DeliveryRange {
  var range: Double
  let center: Location
}
let storeLocation = Location(latitude: 44.9871,
                             longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
                               center: storeLocation)

다음과 같이 범위에 액세스 (인쇄) 할 수 있습니다.

    print(pizzaRange.range) // 200

도트 구문을 사용하여 멤버 멤버에 액세스 할 수도 있습니다.

 print(pizzaRange.center.latitude) // 44.9871

도트 구문을 사용하여 값을 읽는 방법과 비슷하게 도트를 지정할 수도 있습니다.

pizzaRange.range = 250


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