实例方法 (Instance Methods)
实例方法是属于某个特定类、结构体或者枚举类型实例的方法。实例方法提供访问和修改实例属性的方法或提供与实例目的相关的功能,并以此来支撑实例的功能。
class counter
{
var count = 0
func increment() {
count += 1
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
let cou = counter()
print("\(cou.count)")
cou.increment()
print("\(cou.count)")
cou.incrementBy(5)
print("\(cou.count)")
cou.reset()
print("\(cou.count)")
//0
//1
//6
//0
counter类定义了三个实例方法:
increment让计数器按一递增;
incrementBy(amount: Int)让计数器按一个指定的整数值递增;
reset将计数器重置为0。
Swift 中的方法和 Objective-C 中的方法极其相似。像在 Objective-C 中一样,Swift 中方法的名称通常用一个介词指向方法的第一个参数,比如:with,for,by等等。前面的counter类的例子中incrementBy(_:)方法就是这样的。
self 属性(The self Property)
类型的每一个实例都有一个隐含属性叫做self,self完全等同于该实例本身。可以在一个实例的实例方法中使用这个隐含的self属性来引用当前实例。
func increment() {
self.count += 1
}
实际上,一般不在代码里面经常写self。只有在实例方法的某个参数名称与实例的某个属性名称相同的时候。在这种情况下,参数名称享有优先权,并且在引用属性时必须使用一种更严格的方式。这时使用self属性来区分参数名称和属性名称。
struct point {
var x = 2
func istoright(x:Int) -> Bool {
return self.x > x
}
}
let somepoint = point()
if somepoint.istoright(1)
{
print("输出为0")
}
如果不使用self前缀,Swift 就认为两次使用的x都指的是名称为x的函数参数。
在实例方法中修改值类型(Modifying Value Types from Within Instance Methods)
结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改。
但是,如果确实需要在某个特定的方法中修改结构体或者枚举的属性,可以为这个方法选择可变(mutating)行为,然后就可以从其方法内部改变它的属性;并且这个方法做的任何改变都会在方法执行结束时写回到原始结构中。方法还可以给它隐含的self属性赋予一个全新的实例,这个新实例在方法结束时会替换现存实例。
struct point {
var x = 2,y = 3
mutating func istoright(x:Int,y :Int) {
self.x = x + self.x
self.y = y + self.y
}
}
var somepoint = point()
somepoint.istoright(1, y: 2)
print("x = \(somepoint.x), y = \(somepoint.y)")
//x = 3, y = 5
类型方法 (Type Methods)
实例方法是被某个类型的实例调用的方法。也可以定义在类型本身上调用的方法,这种方法就叫做类型方法(Type Methods)。在方法的func关键字之前加上关键字static,来指定类型方法。类还可以用关键字class来允许子类重写父类的方法实现。
在 Objective-C 中,你只能为 Objective-C 的类类型(classes)定义类型方法(type-level methods)。在 Swift 中,可以为所有的类、结构体和枚举定义类型方法。每一个类型方法都被它所支持的类型显式包含。
class someClass {
static func sometype() {
print("执行方法")
}
}
someClass.sometype()
//执行方法