美文网首页
swift从零开始-12-方法

swift从零开始-12-方法

作者: SPIREJ | 来源:发表于2017-11-20 12:02 被阅读12次

包含内容:

  • 实例方法
  • 类型方法

方法

swiftCObuect-C的主要区别就是结构体和枚举可以定义方法。

一、实例方法

实例方法是属于一个特定的类、结构体或枚举的实例的函数,函数是实例的支柱,通过提供访问实例属性和修改实例属性的方法,或提供相关实例功能的目的。实例方法和函数有相同的语法,就像功能的描述。
一个实例方法只能被它所属的类的特定实例调用

例:定义一个Counter类,Counter能被用来对一个动作发生的次数进行计数

class Counter {
    var count = 0
    func increment() {
        count += 1
    }
    
    func incrementBy(amount: Int) {
        count += amount
    }
    
    func reset() {
        count = 0
    }
}
//Counter 类定义了三个实例方法:
//increment 计数器增量加1
//incrementBy(amount:Int) 计数器由特定的整数作为增量
//reset 重置计数器的增值为0
//该Counter类也定义了一个属性变量count,用来维持当前计数器的值的轨道。
方法的局部和外部参数名

swift函数的参数可以拥有一个局部名称(在函数体内使用)和一个外部名称(在调用函数时使用)作为外部参数名的描述。

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

Counter2类中的incrementBy方法有两个参数,默认情况下,swift将amount视为唯一的局部名称,但将numberOfTimes同时视为局部名称和外部名称

let counter = Counter2()
counter.incrementBy(amount: 5, numberOfTimes: 3)

相反的如果不想显示的使用外部参数名,则可以使用_来替代参数名,一般显示的使用外部参数名使调用函数时参数意义更明确

func Test(amount: Int, _: String) -> Int{
    return amount
}
let A = Test(amount:5, "OK")
self 属性

每一个类型的实例都有一个称为self的隐式属性,它是完全等同于该实体本身的。
主要的异常发生在一个实例方法的参数名和实例的属性名相同。在这种情况下,参数名有限,有必要参考属性更多的合格方式,可以用隐式的self属性区分参数名和属性名

struct Point {
    var x = 0.0, y = 0.0
    func isToTheRightOf(x: Double) -> Bool {
        return self.x > x
    }
}
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOf(x:2.0) {
    print("self.x > x")
}
修改值类型的实例方法

结构体和枚举都是值类型。默认情况下,值类型的属性不能从它的内部实例方法修改。如果你需要修改结构体或者枚举的属性在一个特定的方法中,可以在这个方法中选择加入变异行为。通过mutating关键字写在方法的func关键字前

struct Point2 {
    var x = 0.0, y = 0.0
    mutating func moveByX(deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
var somePoint2 = Point2(x: 1.0, y: 1.0)
somePoint2.moveByX(deltaX:2.0, y: 3.0)
print(somePoint2.x, somePoint2.y)

上面的Point2结构体定义了一个变异的moveByX方法,它通过一定量移动一个Point2实例,mutating关键字添加到方法的定义上,使它能够修改它的属性。

由变异方法分配self
变异方法可以分配一个全新的实例给隐式的self属性。

struct Point3 {
    var x = 0.0, y = 0.0
    mutating func moveByXY(deltaX: Double, y deltaY: Double) {
        self = Point3(x: x + deltaX, y: y + deltaY)
    }
}
二、类型方法

//类型方法:由类型自身调用的方法。func关键字前面写上class关键字来声明类的类型方法,而在结构体或枚举内定义类型方法则需要在关键字前书写static关键字来声明

class SomeClass {
    class func someTypeMethod() {
        //
    }
}
SomeClass.someTypeMethod()

PS:在类型方法体中,self指向这个类型本身,而不是类型的某个实例。这意味着你可以用self来消除类型属性和类型方法参数之间的歧义。

相关文章

网友评论

      本文标题:swift从零开始-12-方法

      本文链接:https://www.haomeiwen.com/subject/jxqvvxtx.html