Swift编程语言,用句点启动属性是什么意思

时间:2016-08-07 14:22:51

标签: swift function class

例如,在以下代码行中:

.userInitiated

为什么{{1}}以句号开头?这是从Objective C开始还是特定于Swift?

3 个答案:

答案 0 :(得分:10)

注意: TLDR 版本底部

这称为Implicit member expression

  

隐含会员表达

     

隐式成员表达式是在类型推断可以确定隐含类型的上下文中访问类型成员(如枚举大小写或类型方法)的缩写方法。

只要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

的类型

答案 1 :(得分:3)

其他答案很好地描述了OP的情况。但是“点语法”不是Swift中的“仅限枚举”功能,它以更一般的方式实现。

您可以使用“点语法”访问返回该类型实例的所有类型成员,其中可以推断出类型。

所以,你可以这样写:

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

Swift 2

var myObject: MyClass = .`default` //Accessing a type property
myObject = .cachedInstance(2) //Accessing a type method
myObject = .init(value: 1) //Accessing an initializer

答案 2 :(得分:1)

实际上是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可以从上下文推断出类型。

我说enums不必具有相关价值,但他们可以。具有相关值的枚举可能非常强大,而且它是我最喜欢的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