【发布时间】:2016-12-13 09:28:10
【问题描述】:
例如,在以下代码行中:
DispatchQueue.global(qos: .userInitiated).async { ... }
为什么.userInitiated 以句点开头?这是来自 Objective C 还是特定于 Swift?
【问题讨论】:
例如,在以下代码行中:
DispatchQueue.global(qos: .userInitiated).async { ... }
为什么.userInitiated 以句点开头?这是来自 Objective C 还是特定于 Swift?
【问题讨论】:
注意:TLDR版本在底部
隐式成员表达式
隐式成员表达式是在类型推断可以确定隐含类型的上下文中访问类型成员(例如枚举案例或类型方法)的一种缩写方式。
所以只要 Swift 知道类型,你通常可以省略输入,比如
let colour: UIColor = .red
它通常用于枚举值和静态类型,可用于将参数传递给函数,例如上面的 DispatchQueue 示例。另一个简化的例子是:
enum Colors {
case yellow, blue, red, green
}
所以如果你有这个功能..
func draw(withColor: Colors) {
}
您应该能够像这样传递带有 .prefix 的枚举
draw(withColor: .yellow)
这是一个快捷方式的更详细的方式是:
draw(withColor: Colors.yellow)
解决方案
为了具体回答您的问题,这里的.userInitiated 实际上是DispatchQoS 上的一个静态属性,因此它只是键入DispatchQoS.userInitiated 的一种更短的方式。 Swift 允许你缩短它,因为它知道预期的类型是 DispatchQoS
【讨论】:
其他答案很好地描述了 OP 的情况。但“点语法”并不是 Swift 中的“仅枚举”特性,它以更通用的方式实现。
您可以使用“点语法”访问返回类型实例的所有类型成员,其中可以推断类型。
所以,你可以这样写:
斯威夫特 3
class MyClass {
var value: Int
init(value: Int) {
self.value = value
}
static var `default` = MyClass(value: 0)
private static var cache: [Int: MyClass] = [:]
static func cachedInstance(value: Int) -> MyClass {
if let instance = cache[value] {
return instance
} else {
let instance = MyClass(value: value)
cache[value] = instance
return instance
}
}
}
var myObject: MyClass = .default //Accessing a type property
myObject = .cachedInstance(value: 2) //Accessing a type method
myObject = .init(value: 1) //Accessing an initializer
斯威夫特 2
var myObject: MyClass = .`default` //Accessing a type property
myObject = .cachedInstance(2) //Accessing a type method
myObject = .init(value: 1) //Accessing an initializer
【讨论】:
这实际上是一个Enumeration。枚举可以是多种情况之一。在您的示例中,案例是.userInitiated,它是QOSClass.userInitiated 的缩写。这个案子真的代表了一些东西,它不必有任何相关的价值。 Apple 在他们的网站上有一个很好的、实用的枚举示例:
enum CompassPoint {
case North
case South
case East
case West
}
您可以通过在类型后面加上一个点,然后是成员名称来访问枚举成员,如下所示:CompassPoint.North。但是,如果预期的类型从上下文中是明确的,那么您可以不使用该类型,而只需使用 .North。
在您的示例中,枚举类型为QoSClass。但是因为DispatchQueue.global(qos:) 需要一个QoSClass 类型的枚举,所以你可以不使用类型而只使用.userInitiated,因为Swift 可以从上下文推断类型。
我说过枚举不必有关联的值,但它们可以。具有关联值的枚举可能非常强大,它是我最喜欢的 Swift 部分之一。你可以在这里阅读更多关于这一切的信息:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html
您还可以在此处查看有关如何实现新 GCD API 的更多信息:https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md
【讨论】: