programing

왜 스위프트에 편의 키워드가 필요한가?

oldcodes 2023. 4. 9. 22:21
반응형

왜 스위프트에 편의 키워드가 필요한가?

및 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이니셜라이저는 몇 가지 특정 규칙을 준수해야 합니다.

  1. A convenience할 수 클래스 initializer는 할 수 없습니다.

  2. A convenience는 chain initializer의 .

  3. A convenienceinitializer는 다른 initializer를 호출하기 전에 속성을 변경할 수 없습니다.단, 지정된 initializer는 다른 initializer를 호출하기 전에 현재 클래스에 의해 도입된 속성을 초기화해야 합니다.

「 」를 해 주세요.convenience키워드, Swift 컴파일러는 이러한 조건을 체크해야 한다는 것을 알고 있습니다.을 사용법

다른 유저가 여기서 설명한 점 이외에는, 제가 조금 이해하고 있는 것이 있습니다.

편의 이니셜라이저와 확장의 연관성을 강하게 느끼고 있습니다.편의 이니셜라이저는 기존 클래스의 초기화를 수정(대부분 짧게 또는 쉽게)하는 경우에 가장 유용합니다.

를 들어 에는 " "가 있습니다.init4개의 파라미터가 있지만 어플리케이션에서는 마지막 2개의 값이 동일합니다. 하려면 , 「」를 정의할 수 .convenience init이고 그 에 2개의 파라미터가 있습니다.self.init[ last to parameters ](파라미터)

클래스에는 여러 개의 지정된 이니셜라이저를 포함할 수 있습니다.편의 이니셜라이저는 같은 클래스의 지정 이니셜라이저를 호출해야 하는 세컨더리 이니셜라이저입니다.

언급URL : https://stackoverflow.com/questions/30896231/why-convenience-keyword-is-even-needed-in-swift

반응형