牛骨文教育服务平台(让学习变的简单)

⽅法是与某些特定类型相关联的函数。

类、结构体、枚举都可以定义实例⽅法;实例⽅法为给定类型的实例封装了具体的任务与功能。

类、结构体、枚举也可以定义类型⽅法;类型⽅法与类型本⾝相关联。类型⽅法与 Objective-C 中的类⽅法(class methods)相似

结构体和枚举能够定义⽅法是 Swift 与 C/Objective-C 的主要区别之⼀

1、实例方法:

import Foundation

class Person {
    var age = 1;
    var name = "xiaoming";
    //这就是实例方法,定义在所属类型的前后大括号之间
    //实例⽅法能够隐式访问它所属类型的所有的其他实例⽅法和属性
    func printAge() {
        print("the (self) age is  (self.age)")
    }
    func printNameAndAge(){
        print("the (self) name is (self.name)")
        self.printAge()
    }
}
let p1 = Person()
p1.printNameAndAge()
p1.name = "dzl"
p1.age = 12;
p1.printNameAndAge()
//the _5_swift之_方法.Person name is xiaoming
//the _5_swift之_方法.Person age is  1
//the _5_swift之_方法.Person name is dzl
//the _5_swift之_方法.Person age is  12

类Person定义了两个属性,两个实例方法,其中实例方法printNameAndAge()调用实例方法printAge()

(1)、方法的局部参数名称和外部参数名称

Swift 默认仅给⽅法的第⼀个参数名称⼀个局部参数名称;默认同时给第⼆个和后续的参数名称局部参数名称和外部参数名称

class Cat {
    var name = "xiaohua"
    var age = 1
    //这里newName只是局部参数名称,而newAge既是局部参数名称又是外部参数名称
    func newNameAndAge(newName : String, newAge : Int) -> Void {
        self.name = newName
        self.age = newAge
    }
    //通过下划线(_)取消第二个及后续参数的默认外部参数名称
    func useXiaHuaXian(newName : String, _ newAge : Int) {
        self.name = newName
        self.age = newAge
    }
    
    //自定义外部参数名称
    func setNameAndAge(subNewName newName : String, subNewAge newAge : Int) {
        self.name = newName
        self.age = newAge
    }
}
var cat1 = Cat()
cat1.newNameAndAge("cat1", newAge: 2)
cat1.setNameAndAge(subNewName: "cat2", subNewAge: 3)
cat1.useXiaHuaXian("cat3", 4)

(2)、在实例方法中修改值类型

结构体和枚举是值类型。⼀般情况下,值类型的属性不能在它的实例⽅法中被修改。但是,如果你确实需要在某个具体的⽅法中修改结构体或者枚举的属性,你可以选择 变异⽅法(mutating)  这个⽅法,然后⽅法就可以从⽅法内部改变它的属性;并且它做的任何改变在⽅法结束时还会保留在原始结构中。⽅法还可以给它隐含的 self  属性赋值⼀个全新的实例,这个新实例在⽅法结束后将替换原来的实例

struct MyPoint {
    var x = 0.0
    var y = 0.0
    mutating func changePoint(newX newX : Double, newY : Double) {
        x += newX
        y += newY
    }
    //⽅法还可以给它隐含的 self  属性赋值⼀个全新的实例,这个新实例在⽅法结束后将替换原来的实例
    mutating func changeMyPoint(newX : Double, newY : Double) {
        self = MyPoint(x: x + newX, y: y + newY)
    }
}
var point1 = MyPoint(x: 2, y: 3)
point1.changePoint(newX: 1, newY: 1);
print("the point, x = (point1.x)  y = (point1.y)")
point1.changeMyPoint(2, newY: 2)
print("the point, x = (point1.x)  y = (point1.y)")
//the point, x = 3.0  y = 4.0
//the point, x = 5.0  y = 6.0

2、类型方法(加关键字static)

enum EnumTypeFunc : Int{
    case enum1 = 1
    case enum2, enum3
    static func getEnum2() -> EnumTypeFunc {
        return enum2
    }
}
struct StructTypeFunc {
    static var name = "struct"
    static func getName() -> String {
        return name
    }
}
class ClassTypeFunc {
    static var name = "class"
    static func getName1() -> String {
        return name
    }
    //关键字class允许子类重写父类方法
    class func getName2() -> String {
        return name
    }
}
print(EnumTypeFunc.getEnum2())
print(StructTypeFunc.getName())
print(ClassTypeFunc.getName1())
print(ClassTypeFunc.getName2())
//enum2
//struct
//class
//class