【发布时间】:2026-01-21 04:00:02
【问题描述】:
我需要实现 TypeConverter 并稍后将其用作变量类型。受 ObjectMapper 的启发,我定义了以下协议:
protocol TypeConverter {
associatedtype A
associatedtype B
func transformFrom(fromType: A?) -> B?
func transformTo(toType: B?) -> A?
}
具体实现是:
class IntToStringTypeConverter: TypeConverter {
typealias A = Int
typealias B = String
func transformFrom(fromType: Int?) -> String? {
guard let fromType = fromType else { return nil }
return String(fromType)
}
func transformTo(toType: String?) -> Int? {
guard let toType = toType else { return nil }
return Int(toType)
}
}
由于协议TypeConverter有关联类型,我不能将它声明为变量,例如:var转换器:TypeConverter,但我需要这样的功能。这种情况的解决方案是使用 typeErasure。通过这个链接https://medium.com/@NilStack/swift-world-type-erasure-5b720bc0318a 应该是可能的,但我不知道如何。
这是我的尝试,但它不正确:)...这甚至可以通过这种方式解决吗?或者我应该使用这个:https://appventure.me/2017/12/10/patterns-for-working-with-associated-types?
class AnyTypeConverter<Y, Z>: TypeConverter {
typealias A = Y
typealias B = Z
private let _transformFrom: (Z?) -> Y?
private let _transformTo: (Y?) -> Z?
init<W: TypeConverter>(_ iFormTypeConverter: W) where W.A == Y, W.B == Z {
self._transformFrom = iFormTypeConverter.transformFrom
self._transformTo = iFormTypeConverter.transformTo
}
func transformFrom(modelType: Y?) -> Z? {
return transformFrom(modelType: modelType)
}
func transformTo(iFormType: Z?) -> Y? {
return transformTo(iFormType: iFormType)
}
}
【问题讨论】:
-
用例是什么? FWIW 我更喜欢使用单独的
StringConvertable和IntConvertable协议以及符合扩展的所需类型。 -
还有为什么需要
TypeConverter对象。你应该可以声明var converter: IntToStringConverter -
@gadu 感谢您的回复。请参阅下面的评论...
标签: swift generics type-erasure