Swift功能标签混淆

Swift功能标签混淆,swift,function,tags,Swift,Function,Tags,相同的函数代码在不同的文件中,但调用方式不同 在AppDelegate.swift中,我写道: func findIndexOfString(str: String, arr: [String]) -> Int?{ for (index, value) in enumerate(arr){ if (value == str){ return index } } return nil } 我可以这样调用

相同的函数代码在不同的文件中,但调用方式不同

在AppDelegate.swift中,我写道:

func findIndexOfString(str: String, arr: [String]) -> Int?{
    for (index, value) in enumerate(arr){
        if (value == str){
                return index
        }
    }
    return nil
}
我可以这样调用这个函数,没问题:(当然是在AppDeleagte类中)

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

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

为什么??可能swift将不在类中的函数视为全局作用域C函数?

当您将整个函数代码移动到另一个文件--function.swift(不在类中)时,您可以调用该函数,如
let index=findIndexOfString(name,neights)
因为您在类之外定义它,这意味着它是一个全局函数,您可以在任何地方访问它

除非将函数声明为private(这限制了对定义该函数的文件的可见性),否则如果声明为internal(默认),则可以在模块中的任何位置使用它,如果声明为public,则也可以从外部模块中使用它

有关函数的更多信息,请参阅

更新:

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

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

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

Swift默认为方法中的第一个参数名提供本地参数名,默认为第二个和后续参数名提供本地和外部参数名。此约定与您在编写Objective-C方法时熟悉的典型命名和调用约定相匹配,并允许进行表达性方法调用,而无需限定参数名称

考虑这个
计数器
类,它定义了一种更复杂的
incrementBy(:)
方法:

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes: Int) {
        count += amount * numberOfTimes
    }
}
incrementBy(uuuiOfTimes:)
方法有两个参数amount和
numberOfTimes
。默认情况下,Swift仅将金额视为本地名称,但将
numberOfTimes
视为本地名称和外部名称。您可以按如下方式调用该方法:

let counter = Counter()
counter.incrementBy(5, numberOfTimes: 3)
// counter value is now 15
您不需要为第一个参数值定义外部参数名,因为函数名incrementBy(uuz:numberOfTimes:)明确了它的用途。但是,第二个参数由外部参数名限定,以便在调用方法时明确其用途

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

有关更多信息,请参阅此


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

当您将整个函数代码移动到另一个文件--function.swift(不在类中)时,您可以调用该函数,如
let index=findIndexOfString(name,neights)
因为您在类之外定义它,这意味着它是一个全局函数,您可以在任何地方访问它

除非将函数声明为private(这限制了对定义该函数的文件的可见性),否则如果声明为internal(默认),则可以在模块中的任何位置使用它,如果声明为public,则也可以从外部模块中使用它

有关函数的更多信息,请参阅

更新:

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

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

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

Swift默认为方法中的第一个参数名提供本地参数名,默认为第二个和后续参数名提供本地和外部参数名。此约定与您在编写Objective-C方法时熟悉的典型命名和调用约定相匹配,并允许进行表达性方法调用,而无需限定参数名称

考虑这个
计数器
类,它定义了一种更复杂的
incrementBy(:)
方法:

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes: Int) {
        count += amount * numberOfTimes
    }
}
incrementBy(uuuiOfTimes:)
方法有两个参数amount和
numberOfTimes
。默认情况下,Swift仅将金额视为本地名称,但将
numberOfTimes
视为本地名称和外部名称。您可以按如下方式调用该方法:

let counter = Counter()
counter.incrementBy(5, numberOfTimes: 3)
// counter value is now 15
您不需要为第一个参数值定义外部参数名,因为函数名incrementBy(uuz:numberOfTimes:)明确了它的用途。但是,第二个参数由外部参数名限定,以便在调用方法时明确其用途

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

有关更多信息,请参阅此


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

事实上,我的问题是为什么我将代码移动到另一个文件中,调用函数的方式发生了变化(没有标记--arr:)?嗨,我想我找到了关于我问题的另一种解释。。。(调用所有函数并调用方法)。本文说,如果类中未包含的代码将被视为函数,如果是,我将被视为方法。我们调用函数和方法的方式是不同的。我已经在我的答案中提供了一个文档链接,你可以在那里查看。事实上,我的问题是为什么我移动了我的co