爲什麼在Foundation中將編碼常量實現爲只讀變量而不是枚舉?爲什麼NSString編碼常量是作爲變量而不是枚舉實現的?
public var NSUTF32StringEncoding: UInt { get }
public var NSUTF8StringEncoding: UInt { get }
爲什麼在Foundation中將編碼常量實現爲只讀變量而不是枚舉?爲什麼NSString編碼常量是作爲變量而不是枚舉實現的?
public var NSUTF32StringEncoding: UInt { get }
public var NSUTF8StringEncoding: UInt { get }
該接口與實現無關。例如,下面的協議
protocol P {
var value : Int { get }
}
可以這樣實現:
struct S : P {
let value = 0
}
因爲該屬性的唯一要求是要gettable,它是。
但是我不知道它爲什麼不是一個枚舉,但我高度懷疑這是因爲一些古老的Objective-C的東西。
編輯:也許這是因爲所有的方法,採取參數UInt
作爲編碼,因爲與枚舉這將是NSEncoding.Unicode.rawValue
這將鼓舞所有的Objective-C人。
http://nshipster.com/rawoptionsettype指出(通常)NSENUM
註釋C enums
的轉換實際上是一個Swift enum
。我會推測在這種情況下的醜陋轉換是由於未遵守前綴命名約定。如果它是NSStringEncodingUTF8
等,Apple可能會讓Swift頭部遵循Mattt的模式。鑑於這些常數有多大,它們可能早於這些慣例。
枚舉
默認情況下,斯威夫特通過截取枚舉值 名稱前綴進口枚舉。
由於前綴約定沒有得到遵守,如果他們只是進口的目的C頭直接,他們就已經結束了與像NSStringEncoding.NSJapaneseEUCStringEncoding
怪物,他們必須判斷,最好有一個度身定造斯威夫特頭代替。