为什么编码常量在Foundation中实现为只读变量而不是枚举?
public var NSUTF32StringEncoding: UInt { get }
public var NSUTF8StringEncoding: UInt { get }
答案 0 :(得分:2)
http://nshipster.com/rawoptionsettype指出(通常)NSENUM
带注释的C enums
的转换实际上是转换为Swift enum
。我猜想在这种情况下丑陋的转换是由于没有遵守前缀命名约定。如果它是NSStringEncodingUTF8
等,Apple可能会使得Swift标题遵循Mattt的模式。鉴于这些常数的年龄,它们可能早于这些惯例。
枚举
默认情况下,Swift通过截断枚举值来导入枚举 名字前缀。
由于没有遵循前缀约定,如果他们只是直接导入了Objective C标题,那么他们最终会遇到像NSStringEncoding.NSJapaneseEUCStringEncoding
这样的怪物,他们一定认为最好有一个量身定制的Swift改为标题。
答案 1 :(得分:0)
该接口与实现无关。例如,以下协议
protocol P {
var value : Int { get }
}
可以像这样实现:
struct S : P {
let value = 0
}
因为对该属性的唯一要求是gettable,它就是。
但我不知道为什么它不是枚举,但我非常怀疑它是因为一些古老的Objective-C事物。
编辑:也许是因为所有采用参数UInt
作为编码的方法,因为使用枚举这将是NSEncoding.Unicode.rawValue
,这会激怒所有Objective-C人。