ܕͷਖ਼͠͞Λଛͳ͏
let a = AnyCollection(["hello"])
let b = AnyCollection("hello")
let c = b[a.startIndex]
࣮ߦ࣌(!)Τϥʔ
Collection.Indexʹؔ͢Δܕใ͕ࣦΘΕ͍ͯ
Δ
11
Slide 12
Slide 12 text
ॻ͖ࠐΈ
protocol P {}
extension Int : P {}
struct Container {
var value: P {
get { return _value }
set { _value = newValue as! Int }
}
var _value: Int = 1
}
࣮࣭తʹsuper typeͳͷͰɺcontravarianceϙδγϣϯͰյ
ΕΔ
12
Slide 13
Slide 13 text
ύϑΥʔϚϯεΛଛͳ͏
ϥούʔʹแ·ΕͯΔ͍
13
Slide 14
Slide 14 text
ղܾํ๏
14
Slide 15
Slide 15 text
Opaque Result Type
some P
ʮϓϩτίϧPΛຬͨ͢ԿΒ͔ͷܕʯΛද͢ه๏
15
Slide 16
Slide 16 text
ؔͷฦΓͰ͑Δ
extension Int : P {}
func getP() -> some P {
return 3
}
16
Slide 17
Slide 17 text
ϓϩύςΟͰ͑Δ
var propertyP: some P {
get { ... }
set { ... }
}
17
Slide 18
Slide 18 text
associated type͕͍ͭͯͯ͑Δ
func numbers() -> some MutableCollection {
return [1, 2, 3]
}
var xs = numbers()
let i0 = xs.startIndex
let i1 = xs.index(after: i0)
xs[i0] = xs[i1]
print(xs) // [2, 2, 3]
18
Slide 19
Slide 19 text
͕͜͜ϛι
2ͭͷsome Pҧ͏ܕ
func f1() -> some P
func f2() -> some P
var a = f1()
let b = f2()
a = b // ίϯύΠϧΤϥʔ
19
Slide 20
Slide 20 text
ORTؔ୯ҐͷΞΠσϯςΟςΟΛ࣋ͭ
ԼهͷΑ͏ͳঢ়ଶΛ૾͢Δͱྑ͍
struct ResultOfF1 : P {}
func f1() -> ResultOfF1
struct ResultOfF2 : P {}
func f2() -> ResultOfF2
var a = f1()
let b = f2()
a = b // ίϯύΠϧΤϥʔ
20
Slide 21
Slide 21 text
ORTͷநԽදݱ
some Pͱͯ͠ҙຯ͚͞ΕΔͨΊɺকདྷͷόʔ
δϣϯͰਅͷܕΛมߋͰ͖Δ
ιʔεޓੑ͚ͩͰͳ͘ɺόΠφϦޓੑ͕͋
Γɺ࠶ίϯύΠϧͤͣʹมߋͰ͖Δ
// ver 1.0.0
func f() -> some P { return 3 }
// ver 1.1.0
func f() -> some P { return "3" }
21
Slide 22
Slide 22 text
ͷղܾΛΈ͍ͯ͘
• ܕใͷอ࣋
• ॻ͖ࠐΈ
• ύϑΥʔϚϯε
22
Slide 23
Slide 23 text
ܕใͷอ࣋
func numbers() -> some Collection { return [1, 2, 3] }
func message() -> some Collection { return "hello" }
let a = numbers()
let b = message()
let x = a[b.startIndex] // ܕΤϥʔ
23
Slide 24
Slide 24 text
ॻ͖ࠐΈՄೳ
struct S {
var value: some P {
get { return _value }
set { _value = newValue as! Int }
}
var _value: Int = 3
}
var s = S()
let x = s.value
s.value = x // OK
s.value = Int(1) // Error
s.value = "hello" // Error
24