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 处得到答案。
不同文件中的相同功能代码,但调用方式不同
在 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 处得到答案。