swift イニシャライザー復習会 #love_swift #akibaswift #21cafe
TRANSCRIPT
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() }