OptionalType もしくは OptionalProtocol はどういったテクニックなのでしょうか?
はじめに
Call can throw, but it is not marked with 'try' and the error is not handled
の質問に対して、自分自身で下記の回答をしました。
https://ja.stackoverflow.com/a/56880/9008
オープンソース
自分自身で回答しておきながら、よくわからない部分があるのですが、
オープンソースを見てみるとよくあるテクニック(イディオム)のように思えてきました。
SwiftyUserDefaults(引用)
public protocol OptionalType {
associatedtype Wrapped
var wrapped: Wrapped? { get }
}
extension Optional: OptionalType {
public var wrapped: Wrapped? {
return self
}
}
Realm(引用)
/// :nodoc:
public protocol OptionalProtocol {
associatedtype Wrapped
/// :nodoc:
// swiftlint:disable:next identifier_name
func _rlmInferWrappedType() -> Wrapped
}
extension Optional: OptionalProtocol {
/// :nodoc:
// swiftlint:disable:next identifier_name
public func _rlmInferWrappedType() -> Wrapped { return self! }
}
質問
この OptionalType
や OptionalProtocol
はどういったテクニックなのでしょうか?
特に
associatedtype Wrapped
と
Swift自体の
public enum Optional<Wrapped> : ExpressibleByNilLiteral
の<Wrapped>
の関係性について教えて下さい。