@@ -5,6 +5,86 @@ _**Note:** This is in reverse chronological order, so newer entries are added to
5
5
6
6
## Swift 5.7
7
7
8
+ * [ SE-0309] [ ] :
9
+
10
+ Protocols with associated types and ` Self ` requirements can now be used as the
11
+ types of values with the ` any ` keyword.
12
+
13
+ Protocol methods that return associated types can be called on an ` any ` type;
14
+ the result is type-erased to the associated type's upper bound, which is another
15
+ ` any ` type having the same constraints as the associated type. For example:
16
+
17
+ ``` swift
18
+ protocol Surface {... }
19
+
20
+ protocol Solid {
21
+ associatedtype SurfaceType : Surface
22
+ func boundary () -> SurfaceType
23
+ }
24
+
25
+ let solid: any Solid = ...
26
+
27
+ // Type of 'boundary' is 'any Surface'
28
+ let boundary = solid.boundary ()
29
+ ```
30
+
31
+ Protocol methods that take an associated type or ` Self ` cannot be used with ` any ` ,
32
+ however in conjunction with [ SE-0352] [ ] , you can pass the ` any ` type to a function
33
+ taking a generic parameter constrained to the protocol. Within the generic context,
34
+ type relationships are explicit and all protocol methods can be used.
35
+
36
+ * [ SE-0346] [ ] :
37
+
38
+ Protocols can now declare a list of one or more primary associated types:
39
+
40
+ ``` swift
41
+ protocol Graph <Vertex, Edge> {
42
+ associatedtype Vertex
43
+ associatedtype Edge
44
+ }
45
+ ```
46
+
47
+ A protocol-constrained type like ` Graph<Int> ` can now be written anywhere that
48
+ expects the right-hand side of a protocol conformance requirement:
49
+
50
+ ``` swift
51
+ func shortestPath <V , E >(_ : some Graph<V>, from : V, to : V) -> [E]
52
+
53
+ extension Graph <Int> {... }
54
+
55
+ func build () -> some Graph<String > {}
56
+ ```
57
+
58
+ A protocol-constrained type is equivalent to a conformance requirement to the protocol
59
+ itself together with a same-type requirement constraining the primary associated type.
60
+ The first two examples above are equivalent to the following:
61
+
62
+ ``` swift
63
+ func shortestPath <V , E , G >(_ : G, from : V, to : V) -> [E]
64
+ where G: Graph, G.Vertex == V, G.Edge == V
65
+
66
+ extension Graph where Vertex == Int {... }
67
+ ```
68
+
69
+ The ` build() ` function returning ` some Graph<String> ` cannot be written using a ` where `
70
+ clause; this is an example of a constrained opaque result type, which could not be written
71
+ before.
72
+
73
+ * [ SE-0353] [ ] :
74
+
75
+ Further generalizing the above, protocol-constrained types can also be used with ` any ` :
76
+
77
+ ``` swift
78
+ func findBestGraph (_ : [any Graph<Int >]) -> any Graph<Int > {... }
79
+ ```
80
+
81
+ * [ SE-0358] [ ] :
82
+
83
+ Various protocols in the standard library now declare primary associated types, for
84
+ example ` Sequence ` and ` Collection ` declare a single primary associated type ` Element ` .
85
+ For example, this allows writing down the types ` some Collection<Int> ` and
86
+ ` any Collection<Int> ` .
87
+
8
88
* References to ` optional ` methods on a protocol metatype, as well as references to dynamically looked up methods on the ` AnyObject ` metatype are now supported. These references always have the type of a function that accepts a single argument and returns an optional value of function type:
9
89
10
90
``` swift
@@ -9261,6 +9341,7 @@ Swift 1.0
9261
9341
[SE- 0300 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0300-continuation.md>
9262
9342
[SE- 0302 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0302-concurrent-value-and-concurrent-closures.md>
9263
9343
[SE- 0306 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md>
9344
+ [SE- 0309 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0309-unlock-existential-types-for-all-protocols.md>
9264
9345
[SE- 0310 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0310-effectful-readonly-properties.md>
9265
9346
[SE- 0311 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0311-task-locals.md>
9266
9347
[SE- 0313 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0313-actor-isolation-control.md>
@@ -9283,9 +9364,12 @@ Swift 1.0
9283
9364
[SE- 0341 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0341-opaque-parameters.md>
9284
9365
[SE- 0343 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0343-top-level-concurrency.md>
9285
9366
[SE- 0345 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0345-if-let-shorthand.md>
9367
+ [SE- 0346 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0346-light-weight-same-type-syntax.md>
9286
9368
[SE- 0347 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0347-type-inference-from-default-exprs.md>
9287
9369
[SE- 0349 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0349-unaligned-loads-and-stores.md>
9288
9370
[SE- 0352 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0352-implicit-open-existentials.md>
9371
+ [SE- 0353 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0353-constrained-existential-types.md>
9372
+ [SE- 0358 ]: < https: // github.com/apple/swift-evolution/blob/main/proposals/0358-primary-associated-types-in-stdlib.md>
9289
9373
9290
9374
[SR- 75 ]: < https: // bugs.swift.org/browse/SR-75>
9291
9375
[SR- 106 ]: < https: // bugs.swift.org/browse/SR-106>
0 commit comments