如果您询问有关文档的问题,我建议您查看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 的实例属性,因为b 是Baz 类型的实例。
冒着混淆问题的风险,上述模式的一个警告是在 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:) 是它的实现方式(我们确实想知道如何引用这个参数方法内)。