gpt4 book ai didi

ios - 为什么 UIControlState 是结构而不是枚举?

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:00 26 4
gpt4 key购买 nike

我对 UIControlState 的运作方式有点困惑。具体来说,如果我看下面的例子:

sender.setTitle("NewTitle", for: UIControlState.normal) 

我知道这会设置按钮(发件人)正常状态的标题。我原以为 .normal 是 UIControlState 类型的枚举值,但后来了解到它是一个具有常量的结构。第一个问题:

  1. 如果目的只是为了传递一个状态,为什么不将其定义为枚举,而 .normal 是其中一种情况?

其次,当我查看 UIStateControl 的文档时,我看到的只是“常量”的定义,例如:

static var normal: UIControlState

第二/第三个问题:

  1. 为什么 UIStateControl 的“常量”是用“var”而不是“let”定义的?

  2. 如何将 UIControlState 的静态属性定义为“UIControlState”类型?这不是递归吗?

最佳答案

Why is UIControlState a Struct and not an Enum?

UIControlState 根本上不是枚举。枚举是一种“或”类型。

enum Foo {
case a, b, c
}

var f = Foo.a
f = .b
f = .c

所以,在上面的例子中,f可以容纳.a 或者 .b 或者 .c

但是 UIControlState 不是这样;这是一个选项集。一个选项集可以包含一组一个或多个案例。因此它是一个“AND”类型,我们通常使用符合 OptionSetstruct 来实现它们。协议(protocol)。

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]

如果它是一个枚举,我们只能讨论控件是否处于一个特定状态,例如仅高亮显示专注。但这不是一个正确的模型,因为控件可以同时处于多个不同的状态。

另外值得注意的是,对于 UIControlState.normal case 相当于一组空的选项 [];它的意思是“未突出显示或聚焦或选择或禁用或......”。

Secondly, when I look at the documentation for UIStateControl, all I see are definitions of "constants," e.g.:

static var normal: UIControlState

这不太准确。自动生成的 Swift header 中的 UIControlState 声明如下所示:

public struct UIControlState : OptionSet {

public init(rawValue: UInt)


public static var normal: UIControlState { get }

public static var highlighted: UIControlState { get } // used when UIControl isHighlighted is set

public static var disabled: UIControlState { get }

public static var selected: UIControlState { get } // flag usable by app (see below)

@available(iOS 9.0, *)
public static var focused: UIControlState { get } // Applicable only when the screen supports focus

public static var application: UIControlState { get } // additional flags available for application use

public static var reserved: UIControlState { get } // flags reserved for internal framework use
}

您会注意到末尾的 { get } 。这意味着它们只是只读 属性。它们的实际实现方式(如 let 常量、var 只读计算属性等)是一个纯粹的实现细节。

在这种情况下,UIControlState 是在 UIKit 中使用 NS_OPTIONS 宏定义的,Swift imports in as an OptionSet 符合结构,每个选项值都是静态只读属性。

How is UIControlState's static property defined as type "UIControlState?" Isn't that recursive?

不,它根本不是递归的。请记住,它们是 static 属性,因此只不过是命名空间为 UIControlState 的全局变量(它们甚至不需要存储;它们可以被计算,不过,这又是一个实现细节)。

如果它们是实例 存储属性,那么它确实是递归的。但他们不是。

关于ios - 为什么 UIControlState 是结构而不是枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46399384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com