Skip to content

Commit ae35835

Browse files
xwuowenv
andauthored
[Docs] Edits for educational note on PATs (#33736)
* [Docs] Minor edits for educational note on PATs * Adopt reviewer feedback on wording Co-authored-by: Owen Voorhees <[email protected]> * Revert a capitalization change * [Docs] Further revisions based on reviewer feedback for educational note on PATs Co-authored-by: Owen Voorhees <[email protected]>
1 parent 2f6fb2d commit ae35835

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
# Using Protocols with `Self` or Associated Type Requirements
2+
23
Protocols in Swift may be used as types, as part of a generic constraint, or as part of an opaque result type.
34

45
```swift
5-
// CustomStringConvertible can be used as a type.
6+
// `CustomStringConvertible` can be used as a type.
67
func foo(bar: CustomStringConvertible) { /* ... */ }
78

8-
// ...or as a generic constraint on 'T'.
9+
// ...or as a generic constraint on `T`.
910
func bar<T: CustomStringConvertible>(baz: T) { /* ... */ }
1011

1112
// ...or as part of an opaque result type.
1213
func baz() -> some CustomStringConvertible { /* ... */ }
1314
```
1415

15-
While all Swift protocols can be used as generic constraints and as part of opaque result types, not all protocols can be used as types in general. Specifically, if a protocol has a requirement which references `Self` or an associated type, it cannot be used as a type. One such protocol is `Identifiable`, which has the requirement `var id: ID { get }`, where `ID` is an associated type. As a result, the following code is not allowed:
16+
While all Swift protocols can be used as generic constraints and as part of opaque result types, not all protocols can be used as types. Specifically, if a protocol has a requirement which references `Self` (in contexts other than a function's return type) or an associated type, it cannot be used as a type. For example, the protocol `Equatable` requires `static func == (lhs: Self, rhs: Self) -> Bool`, and the protocol `Identifiable` requires `var id: ID { get }`, where `ID` is an associated type. As a result, the following code is not allowed:
1617

1718
```swift
19+
func foo(bar: Equatable) { /* ... */ }
20+
// error: protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements
21+
1822
func foo(bar: Identifiable) { /* ... */ }
1923
// error: protocol 'Identifiable' can only be used as a generic constraint because it has Self or associated type requirements
2024
```
2125

22-
Protocols like `Identifiable` which have `Self` or associated type requirements cannot be used as types because such types would rarely be useful in practice. They would be unable to allow use of `Self` or associated type requirements like `var id: ID { get }` because the associated type is not specified.
26+
These `Self` or associated type requirements cannot be used via a protocol type because they do not have a well-defined meaning without a concrete conforming type. Therefore, Swift does not support the use of protocols as types if they have such `Self` or associated type requirements, since those types would be able to present only a potentially unusable subset of the interface required for instances of concrete conforming types.
2327

24-
When working with protocols having `Self` or associated type requirements constrained generics, opaque result types, or manual type erasure is sufficient to support most use cases. To learn more, see the [Protocols](https://docs.swift.org/swift-book/LanguageGuide/Protocols.html), [Generics](https://docs.swift.org/swift-book/LanguageGuide/Generics.html), and [Opaque Types](https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html) sections of _The Swift Programming Language_.
28+
When working with protocols that have `Self` or associated type requirements, most use cases can be supported by constrained generics, opaque result types, or manual type erasure. To learn more, see the sections on [protocols](https://docs.swift.org/swift-book/LanguageGuide/Protocols.html), [generics](https://docs.swift.org/swift-book/LanguageGuide/Generics.html), and [opaque types](https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html) in _The Swift Programming Language_.

0 commit comments

Comments
 (0)