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
引数のラベルが1つ以上のプロパティと名前を共有する場合は、 self
を使用してプロパティ値を明示的に設定します。
struct Color {
var red, green, blue: Double
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
便利なinit
スウィフトクラスは、複数の初期化方法をサポートしています。 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")
指定された初期化子(スーパークラス指定初期化子を呼び出す)
let d = Baz(someFloat: 3)
利便性init()
let e = Baz()
画像ソース: Swift Programming Languag e
Throwable Initilizer
エラー処理を使用して構造化(またはクラス)初期化子をスロー可能な初期化子として作成する:
列挙型エラーの例:
enum ValidationError: Error {
case invalid
}
エラー処理の列挙型を使用して、Struct(またはクラス)のパラメータが期待される要件を満たしているかどうかをチェックできます
struct User {
let name: String
init(name: String?) throws {
guard let name = name else {
ValidationError.invalid
}
self.name = name
}
}
今度は、スロー可能なイニシャライザを次のように使用できます。
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