swift 方法(实例方法、类方法)

这是我参与更文挑战的第12天,活动详情查看: 更文挑战

方法是与特定类型相关联的函数。

关于方法,Swift 和 OC 最主要的区别是,在Swift中,结构体和枚举都可以定义方法。

实例方法

  • 实例方法

    • 实例方法:属于特定类、结构体或枚举类型的实例的函数
    • 实例方法与函数的语法相同
    • 实例方法可以隐式访问该类型所有其他实例方法和属性,实例方法只能在其所属类型的特定实例上调用
    class Student {
        var name = ""
        func gotoSchool() {
            print("\(name)去学校")
        }
    }
    
    let stu = Student()
    stu.name = "李雷"
    stu.gotoSchool()
    
    log:
    李雷去学校
    复制代码
  • self属性

    • 类型的每个实例都有一个隐式属性self,它等同于实例本身。使用self属性在其自己的实例方法中引用当前实例对象
    • 大多数情况下,不需要在实例方法中使用self属性去引用该实例的属性或者调用其他方法,因为 Swift 会自动推断为当前类型的实例。但是当实例方法的某个参数名称与实例属性名称相同的时,参数名称优先级比较高,若是需要使用属性,则需要用self来区分参数名称和属性名称
    class Student {
        var name = ""
        func sayHI(name :String) {
            print("hello \(name),I am \(self.name)")
        }
    }
    
    let student = Student()
    student.name = "Li lei"
    student.sayHI(name: "hanmeimei")
    
    log:
    hello hanmeimei,I am Li lei
    复制代码
  • 实例方法中修改值类型

    结构体和枚举都是值类型。默认情况下,值类型的属性无法在其实例方法中修改。如果需要在特定方法中修改其属性,可以使用关键字mutating,将其放在枚举或结构体中所定义实例方法的func关键字之前。当方法结束时,所做的任何更改都将写回原始数据结构中。该方法还可以为其隐式self属性分配一个全新的实例,并且该self所表示的新实例将在方法结束时替换现有实例

    • 结构体
    struct Student {
        var name = ""
        mutating func changeName(name:String) {
            //赋值给隐式的self属性
            self = Student.init(name: name)
        }
    }
    
    var student = Student.init(name: "lilei")
    print(student.name)
    
    student.changeName(name: "hanmeimei")
    print(student.name)
    
    log:
    lilei
    hanmeimei
    复制代码
    • 枚举
    enum Color{
        case red
        case yellow
        case green
    
        mutating func changeColor() {
            switch self {
            case .red:
                self = .yellow
            case .yellow:
                self = .green
            case .green:
                self = .red
            }
        }
    }
    
    var color = Color.red
    print(color)
    color.changeColor()
    print(color)
    
    log:
    red
    yellow
    复制代码

类型方法

  • 类型方法:使用类型本身而不是类型的实例去调用的方法。

  • func关键字的前面加static关键字,若当前的类型是类类型时,也可以使用class关键字,对类类型使用class关键字时,表示允许子类重写父类的方法

  • 在类型方法中,隐式的self属性引用的是类型本身而不再是类型的实例。可以使用self属性来消除类属性和类型方法参数之间的歧义

    class Student {
        static var name = "hanmeimei"
        class func sayHI(name :String) {
            print("hello \(name), I am \(self.name)")
        }
    }
    
    Student.sayHI(name: "lilei")
    
    log:
    hello lilei, I am hanmeimei
    复制代码

猜你喜欢

转载自juejin.im/post/6973942521999130632
今日推荐