为什么NSString编码常量实现为变量而不是枚举?

时间:2015-10-11 21:59:35

标签: swift nsstring swift2.1

为什么编码常量在Foundation中实现为只读变量而不是枚举?

public var NSUTF32StringEncoding: UInt { get }

public var NSUTF8StringEncoding: UInt { get }

2 个答案:

答案 0 :(得分:2)

http://nshipster.com/rawoptionsettype指出(通常)NSENUM带注释的C enums的转换实际上是转换为Swift enum。我猜想在这种情况下丑陋的转换是由于没有遵守前缀命名约定。如果它是NSStringEncodingUTF8等,Apple可能会使得Swift标题遵循Mattt的模式。鉴于这些常数的年龄,它们可能早于这些惯例。

特别是https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html声明:

  

枚举

     

默认情况下,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人。