【问题标题】:Swift documentation: instance/type property/method notationSwift 文档:实例/类型属性/方法表示法
【发布时间】:2017-08-12 14:29:51
【问题描述】:

要记录 Ruby,我会写,例如,Time::nowTime#day。如何记录 Swift?

也就是说,在编写 Swift 文档时,类型及其 1) 类型属性或方法或 2) 实例属性或方法的表示法是什么?

例如,在 Ruby 文档中,符号 ::(两个冒号)表示类属性或方法,符号 #(数字符号、井号、井号或井号)表示实例属性或方法.所以,Time::now 表示nowTime 的类属性或方法,Time#day 表示dayTime 的实例属性或方法。

Swift 文档有这样的符号语法吗?

我知道 Swift 文档的函数表示法——例如,Swift append(_ newElement: Element) method for Array 被记录为 append(_:)——因为我在 Apple 的文档中看到了很多这种表示法的示例。但是,我该如何为 Swift 写 Array#append(_:)

【问题讨论】:

    标签: swift class documentation instance notation


    【解决方案1】:

    不幸的是,Swift 没有官方或广泛接受的表示法来区分类型属性/方法和实例属性/方法与类型名称前缀形式。

    (所以,普通的 Swift 程序员(甚至专家)无法理解你在问什么。)

    Swift book中实际上使用了类型名称前缀形式,但并不经常使用。

    据我所知:

    • 在某些部分,类型属性以UInt32.max 之类的形式引用,但正如您所见,这只是使用作为 Swift 表达式有效的实际符号。

    • 1234563 .我在 Swift 的书中找不到一个简单的例子,但初始化器通常以String.init(data:encoding:) 之类的形式引用,这也是 Swift 中的有效表达式。
    • 对于其他情况,实例方法或属性称为instanceVar.methodName(_:)instanceVar.propertyName,当然instanceVar出现在附近的代码sn-p中并不是类型名,这其实不是你在找什么。

    如您所知,在 Apple 的官方参考资料中,方法或属性显示为标题 Instance methodType methodInstance Property类型属性。或以class/static var/letclass/static funcvar/letfunc 为前缀。

    我无法找到一个简短调查的示例,但一些文章(包括 Apple 的)可能也以 TypeName.methodName(_:)(或实例属性)的形式引用了一个实例方法。似乎 Swift 社区认为区分类型成员而实例成员并不重要。

    我不能花太多时间,但似乎很明显

    Swift 没有官方或广泛接受的符号来区分类型属性/方法和实例属性/方法与类型名称前缀形式。

    也许你需要写类似 instance method Array.append(_:) 来代表Array#append(_:)

    (注意,Array.append(_:) 在 Swift 中也是一个有效的表达式。)

    【讨论】:

      【解决方案2】:

      如果您询问有关文档的问题,我建议您查看Jazzy,这是一种用于从您的内联代码 cmets 构建文档的工具。这是从代码 cmets 构建独立文档的好方法,并且符合 Apple 的约定。

      使用的基本约定如下。假设您有一些定义如下的类:

      /// Some incredibly useful class
      
      public class MyClass {
      
          /// Performs some foo-like operation
          ///
          /// - Parameter bar: The bar parameter.
      
          public class func foo(_ bar: String) {
              // do something
          }
      
          /// Some bazzy operation
          ///
          /// - Parameter qux: The bar parameter.
      
          public func baz(_ quz: String) {
              // do something
          }
      }
      

      Jazzy 将生成如下所示的文档:

      注意,它只是向您显示参数标签。如果你点击一个,它会显示它是否是一种类型方法以及参数名称是什么:


      在最初的问题中,您并不清楚您在谈论文档,因此我讨论了在代码中遇到的约定。答案如下。


      在 Swift 中,. 用于实例和属性类型。

      这只是. 之前的问题。如果它是一个类型,它就是一个类型属性/方法。考虑:

      let b = Foo.bar
      

      这是为 Foo 类型引用类型属性 bar。但是,如果. 之前的是一个类型的实例,那么你正在处理一个实例属性/方法。考虑:

      let b = Baz()
      let q = baz.qux
      

      在这种情况下,qux 引用了Baz 的实例属性,因为bBaz 类型的实例。


      冒着混淆问题的风险,上述模式的一个警告是在 Swift 中使用“选择器”(一种较旧的 Objective-C 模式)。在这种情况下,target 的选择表示selector 引用的内容。如果您为target 提供实例,则selector 正在引用实例方法。如果您为target 提供了一个类型,那么selector 将引用一个类型方法。因此,在本例中,selector 引用了一个实例方法:

      Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.foo), userInfo: nil, repeats: false)
      

      而以下将调用类型方法:

      Timer.scheduledTimer(timeInterval: 1, target: ViewController.self, selector: #selector(ViewController.foo), userInfo: nil, repeats: false)
      

      请注意,在这两个示例中,如果我们在同一个类中进行交互,我们通常会完全省略类名。如果它在另一个类中,您只需要显式引用该类型。但我包含这个target/selector 模式只是因为它确实显示了另一种略有不同的Class.method 语法的使用。

      但这个例外是独一无二的。一般模式是xxx.yyy,其中如果xxx 是某种类型的实例,那么yyy 是一个实例属性/方法,而如果xxx 是某种类型的名称,那么yyy 是一个类型属性/方法。


      append(_ newElement:)append(_:) 的引用完全不同。这只是第一个参数 newElement 没有外部标签的情况,因此它被调用时没有标签,例如array.append(object)。所以append(_:) 只是一个符号,显示它是如何调用的(我们不关心内部参数名称是什么),但append(_ newElement:) 是它的实现方式(我们确实想知道如何引用这个参数方法内)。

      【讨论】:

      • 嗯,这不是我想要的答案,但无论如何感谢您的课程。 :-) 我想知道用于文档目的的符号。我更新了我的问题以使其更清楚。
      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2017-07-26
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多