爲什麼UIControlState一個結構,而不是一個枚舉?
UIControlState
是根本不枚舉。枚舉是一個「OR」類型。
enum Foo {
case a, b, c
}
var f = Foo.a
f = .b
f = .c
因此,在上述例子中,f
可容納.a
或.b
或.c
。
但是,這不是與UIControlState
的情況;這是一個選項集。選項集可以包含一組一個或多個案例。因此,它是一個「和」類型,和我們平時用struct
是符合OptionSet
協議執行。
struct Bar : OptionSet {
let rawValue: Int
// Note that the raw values are unique powers of two.
// Each bit represents a flag determining if a given case is present.
static let a = Bar(rawValue: 1) // 001
static let b = Bar(rawValue: 2) // 010
static let c = Bar(rawValue: 4) // 100
}
var b = Bar.a // .a but not .b or .c
b = [.a, .b] // .a and .b, but not .c
b = [.c, .a, .b] // .a and .b and .c
所以,你可以在上面的例子中看到,b
可以容納任何一組.a
,.b
和.c
。
而這與UIControlState
相同;例如,我們可以談論被聚焦控制狀態和強調:
let controlState: UIControlState = [.highlighted, .focused]
如果它是一個enum
,我們只能談論控制是否在一個特定狀態,如只強調或只專注。但那不是一個正確的模型,因爲控件可以同時處於多個不同的狀態。
另外值得注意的是,與UIControlState
,.normal
的情況相當於一個空的選項集[]
;它表示「未突出顯示或聚焦或選擇或禁用或......」。
其次,當我在看的UIStateControl的文件,所有我 看到的是「常量」,例如: -
static var normal: UIControlState
這不是很準確的定義。該UIControlState
聲明中自動生成的斯威夫特頭看起來是這樣的:
你會注意到{ get }
末。這意味着它們只是只讀屬性。它們是如何實際實現的(因爲let
常量,var
只讀計算屬性等)是純粹的實現細節。
在這種情況下,UIControlState
UIKit中被定義與NS_OPTIONS
宏,它夫特imports in as anOptionSet
貼合結構與每個選項值是一個靜態只讀屬性。
UIControlState的靜態屬性如何定義爲類型「UIControlState?」?這不是遞歸嗎?
不,它不是遞歸的。請記住,他們是static
性質,因此不外乎命名空間,UIControlState
全局變量更多的(他們甚至不需要有存儲,他們可以計算,但是再一次這是一個實現細節)。
如果他們是實例存儲的屬性,那麼它確實是遞歸的。但他們不是。
我不知道這個,但如果你看到結構'公共結構UIControlState:OptionSet''OptionSet'是RowRepresntable,所以。正常是好的,可能@ Paulw11可能會在這幫助 –
@ Paulw11這不是由於Obj-C的任何限制;用'NS_ENUM'宏定義的枚舉以'enum's的形式導入到Swift中。這純粹是由於「UIControlState」基本上不是'enum';這是一個選項集。 – Hamish