2017-01-21 8 views
-4

차이가 있습니까? 그리고 deinit의 효과?신속하게 "초기화"란 무엇입니까?

구조체 마크 { VAR 마크 : 지능은 }

구조체 마크 { VAR 마크 : 지능 INIT (상표 : INT) { self.mark = 마크 } }는

+4

[언어 가이드의 초기화 섹션] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html)을 읽는 것이 좋습니다 (In 특히 "구조 유형에 대한 Memberwise Initializers"비트). – Hamish

답변

3

init은 생성시에 또는 class 유형의 등록 정보에 대한 초기 값을 설정하는 데 사용되며, 다른 메소드가 호출되고 다른 함수 또는 메소드에 매개 변수로 전달되기 전에 사용됩니다.

Swift에서는 임의의 비 선택적 속성을이 반환하기 전에 초기 값으로 설정해야합니다. 프로퍼티는 초기 값으로 이미 선언 될 수 있으며, init 메소드에서 설정하지 않아도됩니다.

  • class 유형은 init 방법은 이미 초기 값으로 선언되지 않은 비 선택적인 속성이있는 경우 구현해야합니다.

  • struct 형식의 경우에만 Swift는 초기 값으로 아직 선언되지 않은 각 비 선택적 속성에 대한 매개 변수를 사용하여 init 메서드를 자동으로 생성합니다. 선택적으로 임의의 수의 구조체에 대해 init 개의 메서드를 만들 수 있습니다. 단, 각 개체가 반환 할 때까지는 모든 비표준 속성에 값이 있습니다. 하여 예에서

  • 는 제 2 라인 상에 생성 init 방법 및 신속한 의한 struct 형 제공 init 자동 생성 방법간에 차이가 없다. 그러나 예를 들어 Int 대신 Double을 취한 다음 내부적으로 변환하여 mark 속성을 설정하는 대체 초기화 프로그램을 만들 수 있습니다.

나는 실현하는 중요한 점은 당신이 init 방법을 직접 지정하지 않은 경우에도 struct 유형에 대한 스위프트에 의해 자동으로 생성으로, 하나는 여전히 존재한다고 생각합니다. 따라서 예제의 두 번째 줄과 두 번째 줄에서 init 메서드가 호출되고 있습니다 (기본적으로 동일한 구현입니다). 유일한 차이점은 은 두 번째 줄에 init 구현을 작성했으며 Swift 컴파일러는 첫 번째 줄에 init 메서드를 씁니다.

deinit은 참조로 전달되고 메모리 관리가있는 class 유형에만 존재합니다. class에 선언 한 deinit 메서드는 class 인스턴스에 대한 참조가 더 이상 없을 때 호출되며 메모리에서 해제됩니다. 인스턴스가 파기되기 전에 다양한 관찰 패턴에서 등록 취소하거나 다른 방법으로 정리하는 데 사용됩니다.