【问题标题】:Swift Programming language, what does it mean to start an attribute with a periodSwift编程语言,以句点开头的属性是什么意思
【发布时间】:2016-12-13 09:28:10
【问题描述】:

例如,在以下代码行中:

DispatchQueue.global(qos: .userInitiated).async { ... }

为什么.userInitiated 以句点开头?这是来自 Objective C 还是特定于 Swift?

【问题讨论】:

    标签: swift function class


    【解决方案1】:

    注意: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

    【讨论】:

      【解决方案2】:

      其他答案很好地描述了 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
      

      【讨论】:

        【解决方案3】:

        这实际上是一个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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-05
          • 2022-01-12
          • 1970-01-01
          • 1970-01-01
          • 2010-12-03
          相关资源
          最近更新 更多