Last active
November 10, 2021 15:12
-
-
Save Agarunov/0614434aa8de8080710d444319ae78cc to your computer and use it in GitHub Desktop.
Swift Type Erasure example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: Playground - noun: a place where people can play | |
protocol ObjectMapper { | |
associatedtype SourceType | |
associatedtype ResultType | |
func map(_ object: SourceType) -> ResultType | |
} | |
struct AnyObjectMapper<SourceType, ResultType>: ObjectMapper { | |
private let _box: _AnyMapperBox<SourceType, ResultType> | |
init<MapperType: ObjectMapper>(_ mapper: MapperType) where MapperType.SourceType == SourceType, MapperType.ResultType == ResultType { | |
_box = _MapperBox(mapper) | |
} | |
func map(_ object: SourceType) -> ResultType { | |
return _box.map(object) | |
} | |
} | |
class _AnyMapperBox<SourceType, ResultType>: ObjectMapper { | |
func map(_ object: SourceType) -> ResultType { | |
fatalError("This method is abstract") | |
} | |
} | |
class _MapperBox<Base: ObjectMapper>: _AnyMapperBox<Base.SourceType, Base.ResultType> { | |
private let _base: Base | |
init(_ base: Base) { | |
_base = base | |
} | |
override func map(_ object: Base.SourceType) -> Base.ResultType { | |
return _base.map(object) | |
} | |
} | |
class Article { } | |
typealias ArticleDict = [AnyHashable: Any] | |
class ArticleMapper: ObjectMapper { | |
func map(_ object: ArticleDict) -> Article { | |
// Mapping... | |
return Article() | |
} | |
} | |
class ArticleService { | |
var mapper: AnyObjectMapper<ArticleDict, Article>! | |
} | |
let service = ArticleService() | |
service.mapper = AnyObjectMapper(ArticleMapper()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment