美文网首页swift
iOS开发 - 「Swift 学习」Swift的实例方法与类型方

iOS开发 - 「Swift 学习」Swift的实例方法与类型方

作者: 俺不是大佬儿 | 来源:发表于2022-02-23 12:08 被阅读0次
    在Objective-C中,类是唯一能定义方法的类型,在Swift中可以灵活的在创建的类/结构体/枚举类型里定义方法

    一、实例方法

    实例方法是属于某个特定的类、结构体、枚举类型实例的方法

    实例方法特性

    1.可以访问和修改实例属性;
    2.提供与实例目的相关的功能

    ▪实例方法要写在它所属的类型的前后大括号({})之间。
    ▪实例方法能够隐式访问它所属类型的所有的其他实例方法和属性。
    ▪ 实例方法只能被它所属的类的某个特定实例调用。
    ▪实例方法不能脱离于现存的实例而被调用。

    实例方法中的self属性

    类型的每一个实例都有一个隐含的属性selfself完全等同于该实例本身(与Objective-C中的类中的self相同,等同于实例本身)
    在一个实例的实例方法中可以通过使用这个隐含的self属性来引用当前实例。

    
    class Example {
        
        let a: Int
        let b: Int
        let sum: Int
        
        init(a: Int, b: Int) {
            self.a = a
            self.b = b
            sum = a + b
            print("Self 内: \(sum)")
        }
        
        func tot(c: Int) -> Int {
            return sum - c
        }
        
        func result() {
            print("结果为: \(tot(c: 20))")
            print("结果为: \(tot(c: 50))")
        }
    }
    
    

    调用

    func instanceMethodsStudy (){
        
        let pri = Example.init(a: 100, b: 200)
        let sum = Example.init(a: 50, b: 60)
        pri.result()
        sum.result()
    }
    

    调用结果

    Self 内: 300
    Self 内: 110
    结果为: 280
    结果为: 250
    结果为: 90
    结果为: 60
    

    在实例方法中修改值类型

    Swift 语言中的结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改

    当确实需要在某个具体的方法中修改结构体或者枚举的属性,可以选择变异(mutating)这个方法,然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中

    方法还可以给它隐含的self属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例

    struct rectangularArea {
        var length = 1
        var breadth = 1
        
        func area() -> Int {
            return length * breadth
        }
        //通过mutating定义实例方法改变属性值
        mutating func scaleBy(res: Int) {
            //重写 length breadth值
            length *= res
            breadth *= res
            
            print("当前length:\(length)")
            print("当前breadth:\(breadth)")
        }
    }
    

    调用

    func mutatingStudy (){
        var val = rectangularArea(length: 4, breadth: 6)
        val.scaleBy(res: 2)
        val.scaleBy(res: 20)
        val.scaleBy(res: 200)
    }
    

    调用结果

    当前length:8
    当前breadth:12
    
    当前length:160
    当前breadth:240
    
    当前length:32000
    当前breadth:48000
    

    在可变方法(mutating)中给self赋值

    struct rectangularArea {
        var length = 1
        var breadth = 1
        
        func area() -> Int {
            return length * breadth
        }
        
        mutating func scaleBy(res: Int) {
            //重写 length breadth值
            self.length *= res
            self.breadth *= res
            
            print("当前length:\(self.length)")
            print("当前breadth:\(self.breadth)")
        }
    }
    

    调用

    func mutatingStudy (){
        var val = rectangularArea(length: 4, breadth: 6)
        val.scaleBy(res: 2)
    }
    

    调用结果

    当前length:8
    当前breadth:12
    

    可变方法能够赋给隐含属性 self 一个全新的实例

    二、类型方法

    通过类型本身调用的方法就叫类型方法

    声明结构体/枚举的类型方法,在func关键字前加static关键字

    类会使用关键字class来允许子类重写父类的实现方法

    类型方法调用

    和实例方法一样用点号(.)语法调用

    class MathFormula {
    //声明类型方法
        class func abs(number:Int) -> Int {
            if number < 0
            {
                return (-number)
                
            }else {
                return number
            }
        }
    }
    
    struct absTurn
    {
    //用static关键字声明结构体的类型方法
        static func abs(number: Int) -> Int
        {
            if number < 0
            {
                return (-number)
            } else{
                return number
            }
        }
    }
    

    调用

    func classMethodsStudy (){
        let no = MathFormula.abs(number: -35)
        let num = absTurn.abs(number: -5)
        
        print("获取绝对值结果no:\(no)")
        print("获取反绝对值结果num:\(num)")
    }
    

    调用结果

    获取绝对值结果no:86
    获取反绝对值结果num:3
    

    \color{gray}{欢迎大佬儿来指正纠错,共同学习😏!!}

    相关文章

      网友评论

        本文标题:iOS开发 - 「Swift 学习」Swift的实例方法与类型方

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