왜 스위프트에 편의 키워드가 필요한가?
및 Swift를 수 .init
서로 나란히 배치하고 편리한 것을 사용합니다.
class Person {
var name:String
init(name: String) {
self.name = name
}
init() {
self.name = "John"
}
}
그럼 왜?convenience
워드드? 츠요시다음 사항을 크게 개선하는 것은 무엇입니까?
class Person {
var name:String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "John")
}
}
있습니다.convenience
스토리. 나머지 절반은 기존 답변 중 어느 것도 다루지 않은 것으로, 데스몬드가 댓글에 올린 질문에 답합니다.
에게 왜왜 me me me me me me me me me me를 했을까?
convenience
가 전화할self.init
그냥'?
이 답변에서 살짝 언급했습니다. Swift의 이니셜라이저 규칙 중 몇 가지를 자세히 설명하지만, 주요 초점은 다음과 같습니다.required
를 이해할 필요가 .스위프트 이니셜라이저
Swift는 초기화되지 않은 변수를 허용하지 않으므로 상속된 클래스에서 모든 이니셜라이저를 상속할 수 있다는 보장은 없습니다.초기화되지 않은 인스턴스 변수를 서브클래스에 추가하여 서브클래스에 추가하면 이니셜라이저 상속이 중지됩니다.그리고 자체 이니셜라이저를 추가할 때까지 컴파일러는 우리에게 소리를 지릅니다.
되지 않은 및 인 " " " 가 됩니다.nil
를 참조해 주세요.
이 경우:
class Foo {
var a: Int
}
a
는 초기화되지 않은 인스턴스 변수입니다.은 우리가 않는다.a
★★★★★★★★★★★★★★★★★★:
class Foo {
var a: Int = 0
}
"Initialize" (초기화)a
이니셜라이저 "Initializer":
class Foo {
var a: Int
init(a: Int) {
self.a = a
}
}
, ㄴ, ㄴ, ㄴ으로 분류하면 요?Foo
class Bar: Foo {
var b: Int
init(a: Int, b: Int) {
self.b = b
super.init(a: a)
}
}
을 죠로 했습니다. 변수를 추가하고 값을 설정하는 이니셜라이저를 추가했습니다.b
쓰느냐에 어떤 언어를 쓰느냐에 따라서는 어떤 언어를 쓰느냐에 따라서는 '어느 언어를 쓰느냐', '어느 언어를 쓰느냐', '어느 언어를 쓰느냐'라고 생각할 수 .Bar
상속되었습니다.Foo
" " " " 입니다init(a: Int)
하지만 그렇지 않다.떻게게 그? ???는 어떻게 ?Foo
의 »init(a: Int)
을 줄 b
로 삼다Bar
요요? A/S는 초기화 할 수 요.Bar
이니셜라이저
중가 " "와 무슨 가 있습니까?convenience
무슨 일입니까?
규칙 1
하위 클래스에서 지정된 이니셜라이저를 정의하지 않은 경우 모든 슈퍼 클래스 지정된 이니셜라이저를 자동으로 상속합니다.
규칙 2
서브클래스가 모든 슈퍼클래스 지정 이니셜라이저를 구현(규칙 1에 따라 상속하거나 정의의 일부로 커스텀 구현을 제공함으로써)하는 경우 모든 슈퍼클래스 편의 이니셜라이저를 자동으로 상속합니다.
통지 규칙 2: 편리한 이니셜라이저를 언급합니다.
라는 거야?convenience
키워드 does는 기본값 없이 인스턴스 변수를 추가하는 서브클래스로 상속할 수 있는 이니셜라이저를 나타냅니다.
이 요?Base
링크:
class Base {
let a: Int
let b: Int
init(a: Int, b: Int) {
self.a = a
self.b = b
}
convenience init() {
self.init(a: 0, b: 0)
}
convenience init(a: Int) {
self.init(a: a, b: 0)
}
convenience init(b: Int) {
self.init(a: 0, b: b)
}
}
, 이렇게 3개 요.convenience
이니셜라이저를 클릭합니다.즉, 상속할 수 있는 이니셜라이저가 3개 있습니다.또, 1개의 이니셜라이저(Initializer)가 있습니다(Initializer란 편리한 이니셜라이저가 아닌 모든 이니셜라이저를 말합니다).
기본 클래스의 인스턴스는 다음 4가지 방법으로 인스턴스화할 수 있습니다.
서브클래스를 만듭니다.
class NonInheritor: Base {
let c: Int
init(a: Int, b: Int, c: Int) {
self.c = c
super.init(a: a, b: b)
}
}
을 하고 Base
자체 인스턴스 변수를 추가했지만 기본값을 지정하지 않았기 때문에 자체 이니셜라이저를 추가해야 합니다.init(a: Int, b: Int, c: Int)
이 이 문장의 하지 않습니다.Base
: " " " " " : "init(a: Int, b: Int)
즉, 이니셜라이저를 상속하지 않습니다.Base
:
가 래, 면, 면, 면, 면, 면을 물려받으면 어떻게 될까요?Base
, 「」의 지정 하는 이니셜라이저를 Base
class Inheritor: Base {
let c: Int
init(a: Int, b: Int, c: Int) {
self.c = c
super.init(a: a, b: b)
}
convenience override init(a: Int, b: Int) {
self.init(a: a, b: b, c: 0)
}
}
이에 인티셜라이저는 「2」와 하고 있습니다.Base
이니셜라이저로 을 상속합니다.Base
클 class class classconvenience
★★★★★★★★
가 「」라고 되어 것.convenience
여기엔 차이가 없어요.라는 Inheritor
에는 지정된 이니셜라이저가 1개밖에 없습니다. 만약 가 래 from에서 Inheritor
한이니셜라이저만 1번으로 이어집니다.Inheritor
의 즉아, 아, 아, 아, 아, 아, 아, 아, 아.Base
하여 그 이니셜라이저를 할 수 convenience
이니셜라이저
대부분 명료합니다.당신의 두 번째 예에서
init(name: String) {
self.name = name
}
필수 또는 지정입니다.모든 상수와 변수를 초기화해야 합니다.편의 이니셜라이저는 옵션이며 일반적으로 초기화를 쉽게 하기 위해 사용할 수 있습니다.예를 들어, 사용자 클래스에 성별 변수가 선택적이라고 가정합니다.
var gender: Gender?
여기서 성별은 열거형입니다.
enum Gender {
case Male, Female
}
이와 같은 편리한 이니셜라이저를 사용할 수 있습니다.
convenience init(maleWithName: String) {
self.init(name: name)
gender = .Male
}
convenience init(femaleWithName: String) {
self.init(name: name)
gender = .Female
}
편의 이니셜라이저는 지정된 이니셜라이저 또는 필수 이니셜라이저를 호출해야 합니다.클래스가 서브클래스일 경우 콜해야 합니다.super.init()
을 사용법을 사용하다
음, 우선 생각나는 것은 코드 구성과 가독성을 위해 학급 상속에서 사용된다는 것입니다.하다, 하다, 하다, 하다, 하다.Person
해 주세요.
class Person{
var name: String
init(name: String){
self.name = name
}
convenience init(){
self.init(name: "Unknown")
}
}
class Employee: Person{
var salary: Double
init(name:String, salary:Double){
self.salary = salary
super.init(name: name)
}
override convenience init(name: String) {
self.init(name:name, salary: 0)
}
}
let employee1 = Employee() // {{name "Unknown"} salary 0}
let john = Employee(name: "John") // {{name "John"} salary 0}
let jane = Employee(name: "Jane", salary: 700) // {{name "Jane"} salary 700}
를 사용하여 I consibility initializer를 할 수 .Employee()
즉, 「」, 「」라고 하는 )convenience
Swift 2.1 문서에 따르면convenience
이니셜라이저는 몇 가지 특정 규칙을 준수해야 합니다.
A
convenience
할 수 클래스 initializer는 할 수 없습니다.A
convenience
는 chain initializer의 .A
convenience
initializer는 다른 initializer를 호출하기 전에 속성을 변경할 수 없습니다.단, 지정된 initializer는 다른 initializer를 호출하기 전에 현재 클래스에 의해 도입된 속성을 초기화해야 합니다.
「 」를 해 주세요.convenience
키워드, Swift 컴파일러는 이러한 조건을 체크해야 한다는 것을 알고 있습니다.을 사용법
다른 유저가 여기서 설명한 점 이외에는, 제가 조금 이해하고 있는 것이 있습니다.
편의 이니셜라이저와 확장의 연관성을 강하게 느끼고 있습니다.편의 이니셜라이저는 기존 클래스의 초기화를 수정(대부분 짧게 또는 쉽게)하는 경우에 가장 유용합니다.
를 들어 에는 " "가 있습니다.init
4개의 파라미터가 있지만 어플리케이션에서는 마지막 2개의 값이 동일합니다. 하려면 , 「」를 정의할 수 .convenience init
이고 그 에 2개의 파라미터가 있습니다.self.init
[ last to parameters ](파라미터)
클래스에는 여러 개의 지정된 이니셜라이저를 포함할 수 있습니다.편의 이니셜라이저는 같은 클래스의 지정 이니셜라이저를 호출해야 하는 세컨더리 이니셜라이저입니다.
언급URL : https://stackoverflow.com/questions/30896231/why-convenience-keyword-is-even-needed-in-swift
'programing' 카테고리의 다른 글
Dispatcher를 사용하여 WPF 컨트롤을 비메인 스레드에서 변경합니다.호출하다 (0) | 2023.04.09 |
---|---|
CSS에 비례하여 이미지 크기를 조정하시겠습니까? (0) | 2023.04.09 |
StringFormat을 사용한 WPF 바인딩이 ToolTips에서 작동하지 않음 (0) | 2023.04.09 |
모든 로컬 git 분기 삭제 (0) | 2023.04.09 |
XAML에서 이중 따옴표와 단일 따옴표가 포함된 텍스트를 표시하려면 어떻게 해야 합니까? (0) | 2023.04.09 |