对于协议,要求实例变量符合协议;而不是具有特定类型
Requiring, for a protocol, that an instance variable conform to a protocol ; rather than have a specific type
作为自定义 Coder
的一部分,我以完全相同的方式转换 Float
和 Double
:
static func encode(_ value : Double) -> Data {
withUnsafeBytes(of: value.bitPattern.bigEndian) { Data([=10=]) }
}
static func encode(_ value : Float) -> Data {
withUnsafeBytes(of: value.bitPattern.bigEndian) { Data([=10=]) }
}
我想我可以要求 value
符合协议,因为 FloatingPoint
协议不保证 bitPattern
的存在,我想我会我自己的:
protocol CompatibleFloatingPoint {
var bitPattern : FixedWidthInteger { get }
}
然而,这会产生以下错误:
Protocol 'FixedWidthInteger' can only be used as a generic constraint because it has Self or associated type requirements
但是,我无法用特定类型替换 FixedWidthInteger
,因为 Double.bitPattern
是 UInt64
而 Float.bitPattern
是 UInt32
要求 bitPattern
符合 FixedWidthInteger
协议而不强制其具有特定类型的正确语法是什么?
您要查找的是关联类型。这正是您所描述的(所需类型符合协议而不是该协议的存在):
protocol CompatibleFloatingPoint {
associatedtype BitPattern: FixedWidthInteger
var bitPattern : BitPattern { get }
}
extension Float: CompatibleFloatingPoint {}
extension Double: CompatibleFloatingPoint {}
有关详细信息,请参阅 Swift 编程语言中的 Associated Types。
作为自定义 Coder
的一部分,我以完全相同的方式转换 Float
和 Double
:
static func encode(_ value : Double) -> Data {
withUnsafeBytes(of: value.bitPattern.bigEndian) { Data([=10=]) }
}
static func encode(_ value : Float) -> Data {
withUnsafeBytes(of: value.bitPattern.bigEndian) { Data([=10=]) }
}
我想我可以要求 value
符合协议,因为 FloatingPoint
协议不保证 bitPattern
的存在,我想我会我自己的:
protocol CompatibleFloatingPoint {
var bitPattern : FixedWidthInteger { get }
}
然而,这会产生以下错误:
Protocol 'FixedWidthInteger' can only be used as a generic constraint because it has Self or associated type requirements
但是,我无法用特定类型替换 FixedWidthInteger
,因为 Double.bitPattern
是 UInt64
而 Float.bitPattern
是 UInt32
要求 bitPattern
符合 FixedWidthInteger
协议而不强制其具有特定类型的正确语法是什么?
您要查找的是关联类型。这正是您所描述的(所需类型符合协议而不是该协议的存在):
protocol CompatibleFloatingPoint {
associatedtype BitPattern: FixedWidthInteger
var bitPattern : BitPattern { get }
}
extension Float: CompatibleFloatingPoint {}
extension Double: CompatibleFloatingPoint {}
有关详细信息,请参阅 Swift 编程语言中的 Associated Types。