gpt4 book ai didi

Swift 函数标签混淆

转载 作者:行者123 更新时间:2023-11-28 09:04:38 30 4
gpt4 key购买 nike

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

我在 AppDelegate.swift 中写道:

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

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

let index = findIndexOfString(name, arr: neighbors)

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

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

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

最佳答案

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

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

有关功能的更多信息,您可以引用Apple Documentation .

更新:

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

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

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

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

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

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

这个incrementBy(_:numberOfTimes:) 方法有两个参数—amount 和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 得到答案。

关于Swift 函数标签混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31130720/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com