Swift Language
초기화 기
수색…
기본 속성 값 설정
이니셜 라이저를 사용하여 기본 속성 값을 설정할 수 있습니다.
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 가지 규칙을 준수해야합니다.
- 지정된 이니셜 라이저는 직접 슈퍼 클래스에서 지정된 이니셜 라이저를 호출해야합니다.
- 편리한 초기화 프로그램은 같은 클래스의 다른 초기화 프로그램을 호출해야합니다.
- 편의 초기화 프로그램은 궁극적으로 지정된 초기화 프로그램을 호출해야합니다.
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