Swift中的方法
2019-06-28 本文已影响0人
盖小聂
1、func的参数修饰
2、default参数
3、可变参数函数
4、方法嵌套
5、Selector
6、实例方法的动态调用
1、func的参数修饰
- func 参数的默认修饰符是let
- Swift其实是一门讨厌变化的语言。所有可能的地方,都被默认认为是不可变的,也就是用let进行声明的
- inout:有些时候我们会希望在方法内部直接修改输入的值,这个时候我们可以使用inout来对参数进行修饰。因为在函数内部就更改了值,所以也不需要返回了。调用也要改变为相应的形势,在前面加上&符号。
func incrementor(inout variable: Int) {
varialbe += 1
}
var luckyNumber = 7
incrementor(&luckyNumber)
2、default参数
- Swift的方法支持默认参数,也就是说在声明方法时,可以给某一个参数指定一个默认使用的值。在调用该方法时要是传入了这个参数,则使用传入的值,如果缺少这个输入参数,那么就直接使用设定的默认值进行调用。
- OC中由于语法的特点几乎无法在不大幅度改动的情况下很好的实现默认参数。
- Swift中的默认参数限制更少,并没有所谓“默认参数之后不能再出现无默认值的参数”这样的规则。
func sayHello1(str1: String = "Hello", str2: String, str3: String) {
print(str1 + str2 + str3)
}
func sayHello2(str1: String, str2: String, str3: String = "World") {
print(str1 + str2 + str3)
}
sayHello1(str2: " ", str3: "World")
sayHello2(str1: "Hello", str2: " ")
3、可变参数函数
- 在Swift中写一个可变参数的函数只需要在声明参数时在类型后面加上…就可以了。比如下面就声明了一个接受参数的Int累加函数:
func sum(input: Int…) —> Int
{
//…
}
输入的input在函数体内部将被作为数组[Int]来使用,让我们来完成上面的方法吧:
func sum(input: Int…) —> Int
{
return input.reduce(0, combine: +)
}
print(sum(1,2,3,4,5))
- 在Swift中我们会对方法的参数进行命名,所以我们可以随意地放置可变参数的位置,而不必拘泥于最后一个参数
func myFunc(numbers: Int…, string: String)
{
numbers.forEach {
for i in 0..<$0 {
print(“\(i+1):\(string)”)
}
}
}
myFunc(1,2,3, string: “hello”)
- 限制自然是有的,比如在同一个方法中只能有一个参数是可变的,比如可变参数都必须是同一种类型的等。
- 对于后一个限制,当我们想要同时传入多个类型的参数时就需要做一些变通。
extension NSString {
convenience init(format: NSString, _ args: CVarArgType…)
//…
}
let name = “Tom”
let date = NSDate()
let string = NSString(format: “Hello %@. Date: %@”,name,date)
4、方法嵌套
- 方法终于成为了一等公民,也就是说,我们可以将方法当做变量或者参数来使用了。更进一步地,我们甚至可以在一个方法中定义新的方法,这给代码结构层次和访问级别的控制带来了新的选择。Swift允许方法中嵌套方法的定义,这样就可以按照原本的层次去组织代码,而不需要将不同层次的代码,平铺展开。
5、Selector
- OC中的@selector在Swift中换成了#selector,其他没有什么变化嘛
- selector其实是OC runtime的概念,如果你的selector对应的方法只在Swift中可见的话(也就是说他是一个Swift中的private方法),在调用这个selector时你会遇到一个unrecognized selector错误。正确的做法是在private前面加上@objc关键字,这样运行时就能找到对应的方法了。
private func callMe() {
//…
}
NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: “callMe”, userInfo: nil, repeats: true)
6、实例方法的动态调用
- 在Swift中有一类很有意思的写法,可以让我们不直接使用实例来调用这个实例方法,而是通过类型取出这个类型的某个实例方法的签名,然后再通过传递实例来拿到实例需要调用的方法。
class MyClass {
func method(number: Int) —> Int {
return number + 1
}
}
//Swift中可以直接用Type.instanceMethod的语法来生成一个可以柯里化的方法,
//如果我们观察f的类型(Alt + 单击),可以知道它是:f: (MyClass) —> (Int) —> Int
let f = MyClass.method
let object = MyClass()
let result = f(object)(1)
- 这种方法只适用于实例方法,对于属性的getter或者setter是不能用类似的写法的。