수색…


기본 속성 값 설정

이니셜 라이저를 사용하여 기본 속성 값을 설정할 수 있습니다.

struct Example {
    var upvotes: Int
    init() {
        upvotes = 42
    }
}
let myExample = Example() // call the initializer
print(myExample.upvotes) // prints: 42

또는 기본 속성 값을 속성 선언의 일부로 지정합니다.

struct Example {
    var upvotes = 42 // the type 'Int' is inferred here
}

클래스와 구조체 인스턴스가 생성 될 때까지 저장된 모든 속성을 적절한 초기 값으로 설정 해야합니다 . 이니셜 라이저가 downvotes 초기 값을 제공하지 않았 downvotes 예제는 컴파일되지 않습니다.

struct Example {
    var upvotes: Int
    var downvotes: Int
    init() {
         upvotes = 0
    } // error: Return from initializer without initializing all stored properties
}

매개 변수로 초기화 커스터마이즈하기

struct MetricDistance {
    var distanceInMeters: Double

    init(fromCentimeters centimeters: Double) {
        distanceInMeters = centimeters / 100
    }
    init(fromKilometers kilos: Double) {
        distanceInMeters = kilos * 1000
    }
}

let myDistance = MetricDistance(fromCentimeters: 42)
// myDistance.distanceInMeters is 0.42
let myOtherDistance = MetricDistance(fromKilometers: 42)
// myOtherDistance.distanceInMeters is 42000

매개 변수 레이블은 생략 할 수 없습니다.

let myBadDistance = MetricDistance(42) // error: argument labels do not match any available overloads

매개 변수 레이블의 생략을 허용하려면 밑줄 _ 을 레이블로 사용하십시오.

struct MetricDistance {
    var distanceInMeters: Double
    init(_ meters: Double) {
        distanceInMeters = meters
    }
}
let myDistance = MetricDistance(42) // distanceInMeters = 42

인수 레이블이 하나 이상의 속성과 이름을 공유하는 경우 self 를 사용하여 속성 값을 명시 적으로 설정합니다.

struct Color {
    var red, green, blue: Double
    init(red: Double, green: Double, blue: Double) {
        self.red = red
        self.green = green
        self.blue = blue
    }
}

편이성 초기화

스위프트 클래스는 여러 가지 초기화 방법을 지원합니다. Apple의 사양에 따라 다음 3 가지 규칙을 준수해야합니다.

  1. 지정된 이니셜 라이저는 직접 슈퍼 클래스에서 지정된 이니셜 라이저를 호출해야합니다. 첫 번째 규칙
  2. 편리한 초기화 프로그램은 같은 클래스의 다른 초기화 프로그램을 호출해야합니다.
  3. 편의 초기화 프로그램은 궁극적으로 지정된 초기화 프로그램을 호출해야합니다. 두 번째 및 세 번째 규칙
class Foo {

    var someString: String
    var someValue: Int
    var someBool: Bool

    // Designated Initializer
    init(someString: String, someValue: Int, someBool: Bool)
    {
        self.someString = someString
        self.someValue = someValue
        self.someBool = someBool
    }

    // A convenience initializer must call another initializer from the same class.
    convenience init()
    {
        self.init(otherString: "")
    }
    
    // A convenience initializer must ultimately call a designated initializer.
convenience init(otherString: String)
    {
        self.init(someString: otherString, someValue:  0, someBool: false)
    }
}


class Baz: Foo
{
    var someFloat: Float
    
    // Designed initializer
    init(someFloat: Float)
    {
        self.someFloat = someFloat
        
        // A designated initializer must call a designated initializer from its immediate superclass.
        super.init(someString: "", someValue: 0, someBool: false)
    }
    
    // A convenience initializer must call another initializer from the same class.
    convenience init()
    {
        self.init(someFloat: 0)
    }
}

지정된 초기화 프로그램

let c = Foo(someString: "Some string", someValue: 10, someBool: true)

편리한 init ()

let a = Foo()

편리 성 init (otherString : String)

let b = Foo(otherString: "Some string")

지정된 초기화 프로그램 (Superclass Designated Initializer를 호출합니다)

let d = Baz(someFloat: 3)

편리한 init ()

let e = Baz()

이미지 소스 : Swift Programming Languag e

Throwable Initilizer

오류 처리를 사용하여 구조체 (또는 클래스) 초기화 프로그램을 throw 가능한 초기화 프로그램으로 만들기 :

열거 형 오류 처리 예제 :

enum ValidationError: Error {
    case invalid
}

오류 처리 enum을 사용하여 Struct (또는 클래스)의 매개 변수가 예상 요구 사항을 충족하는지 확인할 수 있습니다.

struct User {
    let name: String

    init(name: String?) throws {

        guard let name = name else { 
           ValidationError.invalid
        }

        self.name = name
    }
}

자, 다음과 같이 throw 가능 초기화 프로그램을 사용할 수 있습니다.

do {
   let user = try User(name: "Sample name")
            
   // success
}
catch ValidationError.invalid {
     // handle error
}


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