Swift 功能标签混乱

Swift function tag confusion

不同文件中的相同功能代码,但调用方式不同

在 AppDelegate.swift 我写道:

func findIndexOfString(str: String, arr: [String]) -> Int?{
    for (index, value) in enumerate(arr){
        if (value == str){
                return index
        }
    }
    return nil
}

我可以这样调用这个函数,没问题:(当然是在 AppDeleagte class)

let index = findIndexOfString(name, arr: neighbors)

然后我将整个函数代码移动到另一个文件--Function.swift(不在 class 中),我必须这样调用函数:

let index = findIndexOfString(name, neighbors) // no arr:

为什么?也许 swift 将不在 class 中的函数视为全局作用域 C 函数?

当您将整个函数代码移动到另一个文件时--Function.swift(不在 class 中)然后您可以像 let index = findIndexOfString(name, neighbors) 一样调用该函数,因为您在class 表示它是一个全局函数,您可以在任何地方访问它。

除非您将函数声明为私有,这会限制对定义它的文件的可见性,否则如果声明为内部(默认),您可以在模块中的任何地方使用它,如果声明为,也可以从外部模块使用它public.

更多函数信息请参考Apple Documentation.

更新:

结构和枚举可以在 Swift 中定义方法这一事实是与 C 和 Objective-C 的主要区别。在 Objective-C 中,只有 classes 是可以定义方法的类型。在 Swift 中,您可以选择是定义 class、结构还是枚举,并且仍然可以灵活地在您创建的类型上定义方法。

方法的本地和外部参数名称:

Swift 中的方法与 Objective-C 中的方法非常相似。

Swift默认给方法中的第一个参数名一个本地参数名,默认给第二个和后面的参数名既本地参数名也给外部参数名。此约定与您在编写 Objective-C 方法时熟悉的典型命名和调用约定相匹配,并且无需限定参数名称即可进行富有表现力的方法调用。

考虑这个 Counter class,它定义了 incrementBy(_:) 方法的更复杂形式:

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes: Int) {
        count += amount * numberOfTimes
    }
}

这个incrementBy(_:numberOfTimes:)方法有两个参数——金额和numberOfTimes。默认情况下,Swift 仅将 amount 视为本地名称,但将 numberOfTimes 视为本地名称和外部名称。您按如下方式调用该方法:

let counter = Counter()
counter.incrementBy(5, numberOfTimes: 3)
// counter value is now 15

你不需要为第一个参数值定义一个外部参数名称,因为它的目的从函数名incrementBy(_:numberOfTimes:)就很清楚了。但是,第二个参数由外部参数名称限定,以便在调用该方法时明确其目的。

上述行为意味着 Swift 中的方法定义使用与 Objective-C 相同的语法风格编写,并以自然的表达方式调用。

有关详细信息,请参阅此 Apple Document

您可以查看 THIS 视频,您将在 0:55 处得到答案。