Swift イニシャライザー復習会 #love_swift #akibaswift #21cafe

Preview:

Citation preview

struct Person { init(name: String, number: Int) { }

}

struct Person { var name: String var number: Int init(name: String, number: Int) { self.name = name

} }

struct Person { init(name: String, number: Int) { guard name.isVaidAsPersionName() else { fatalError("Invalid name") }

:

init? init!

nil

struct Person { init?(name: String, number: Int) { guard name.isVaidAsPersionName() else { return nil }

:

init … throws

struct Person { init(name: String, number: Int) throws { guard name.isVaidAsPersionName() else { throw InitializeError.invalidName }

:

class Person { var name: String var number: Int init?(name: String, number: Int) { guard name.isVaidAsPersionName() else { return nil }

struct Person { init(name: String, number: Int) {

}

init(havingName: String, andNumber: Int) {

}

struct Number { init( _ string: String, radix: Int) {

}

struct WebSite { init(url: String, baseAddress: URL? = nil) {

}

struct Person { var name: String var number: Int init(name: String) { self.name = name self.number = getNextNumber()

}

struct Person { var name: String var number: Int }

// イニシャライザーを定義しなくても使える let someone = Person(name: "Kumagai", number: 2)

struct Person { var name: String var number: Int }

extension Person {

init(name: String) { self.init(name: name, number: getNextNumber()) }

class Base { init(name: String, number: Int) { } }

class Base { convenience init(name: String) { self.init(name: name, number: getNextNumber()) } }

class Base { required init(name: String, number: Int) { } }

extension Object {

convenience init(a: Int) { … }

init(b: Int) { … }

required nit(c: Int) { … }

class View { var textColor = NSColor.black var backgroundColor = NSColor.white init() { }

}

class Object { var value = Value()

init() { value = Value() } }

struct Data { var value = Value()

}

let data = Data(value: Value())

struct Person {

var name: String var number: Int init(name: String) {

self.name = name self.number = getNextNumber() } }

struct Person {

var name: String var number: Int }

extension Persion {

init(name: String) {

self.name = name self.number = getNextNumber() }

struct RandomGenerator { var seed1: UInt32 = arc4random() var seed2: UInt32 = arc4random() }

let gen1 = RandomGenerator() let gen2 = RandomGenerator(seed1: 0, seed2: 1)

public struct MyData { public var value = MyValue()

public init(value: MyValue) { self.value = value } }

public struct MyData { public var value = MyValue() }

extension MyData { public init(memberwiseWithValue value: MyValue) { self.init(value: value) } }

public struct MyData { public var value: MyValue

public init(value: MyValue) { self.value = value } }

let speaker = Person("Kumagai", 1234)

let h = Person.init(name: "Kumagai", number: 1234)

// 関数型変数 f にイニシャライザーを入れて使える let f: (String,Int) -> Person = Person.init(name:number:)

let someone = f("Kumagai", 1234)

// 取り得る型から推論する

let list = MemberList(persons: .init(name: "A"))

// 関数内で、戻り値の型から推論する

func makePerson(name: String) -> Person { return .init(name: name)

}

protocol ExpressibleByName { init(name: String)

}

// 値型をプロトコルに適合させるとき struct Person : ExpressibleByName { init(name: String) { … } } // 参照型をプロトコルに適合させるとき class Thread : ExpressibleByName { required init(name: String) { … } }

// 値型はプロトコルに適合できる extension Person : ExpressibleByName { init(name: String) { … } } // 参照型はプロトコルに適合できない extension Thread : ExpressibleByName { required init(name: String) { … } }

struct Value { init() { … } }

// メタタイプ型の変数に保存して … let type: Value.Type = Value.self

// そこからインスタンスを生成できる let instance: Value = type.init()

型.self

init

class Object { required init(a: Int) {} init(b: Int) {} }

let type: Object.Type = Object.self

let a = type.init(a: 0) let b = type.init(b: 0)

class Base { required init() { … } }

class Sub : Base { required init() { … } }

let types = [Base.self, Sub.self] as [Base.Type] let instances = types.map { $0.init() }

Recommended