方法是与某些特定类型相关联的函数。
结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一。
方法的局部参数名称和外部参数名称 (Local and External Parameter Names for Methods)
Swift 中的方法和 Objective-C 中的方法极其相似。像在 Objective-C 中一样,Swift 中方法的名称通常用一个介词指向方法的第一个参数,比如:with
,for
,by
等等。介词的使用让方法在被调用时能像一个句子一样被解读。
具体来说,Swift 默认仅给方法的第一个参数名称一个局部参数名称;默认同时给第二个和后续的参数名称局部参数名称和外部参数名称。这个约定与典型的命名和调用约定相适应,与你在写 Objective-C 的方法时很相似。这个约定还让富于表达性的方法在调用时不需要再限定参数名称。
self 属性(The self Property)
In practice, you don't need to write self
in your code very often.If you don't explictly write self,Swift assumes that you are referring to a property or method of the current instance whenever you use a known property or method name within a method.
The main exception to this rule occurs then a parameter name for an instance method has the same name as a property of that instance.In this situation, the parameter name takes precedence,and it becomes necessary to refer to the proterty in a more qualified way.You use the self
property to distinguish between the parameter name and the property name.
在实例方法中修改值类型(Modifying Value Types from Within Instance Methods)
结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。
但是,如果你确实需要在某个特定的方法中修改结构体或者枚举的属性,你可以选择变异(mutating)
这个方法,然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。方法还可以给它隐含的self
属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例。
注意,不能在结构体类型的常量上调用可变方法,因为其属性不能被改变,即使属性是变量属性
枚举的可变方法可以把self
设置为同一枚举类型中不同的成员:
enum TriStateSwitch {
case Off, Low, High
mutating func next() {
switch self {
case Off:
self = Low
case Low:
self = High
case High:
self = Off
}
}
}
var ovenLight = TriStateSwitch.Low
ovenLight.next()
// ovenLight 现在等于 .High
ovenLight.next()
// ovenLight 现在等于 .Off
类型方法 (Type Methods)
实例方法是被类型的某个实例调用的方法。你也可以定义类型本身调用的方法,这种方法就叫做类型方法。声明结构体和枚举的类型方法,在方法的func
关键字之前加上关键字static
。类可能会用关键字class
来允许子类重写父类的方法实现。
在类型方法的方法体(body)中,self
指向这个类型本身,而不是类型的某个实例。这意味着你可以用self
来消除类型属性和类型方法参数之间的歧义(类似于我们在前面处理实例属性和实例方法参数时做的那样)。