Swift_方法

Swift_方法


點擊查看源碼git

///方法
class Methods: NSObject {
    
    func test() {
//        self.testInstanceMethods() //實例方法
        self.testTypeMethods()     //類型方法
    }
    
    //實例方法
    func testInstanceMethods() {
        self.testLocalAndExternalParameterNames()
        self.testSelfProperty()
        self.testModifyingValueTypesFromWithinInstanceMethods()
        self.testAssigningToSelfWithinMutatingMethod()
    }
    
    //內部和外部屬性
    func testLocalAndExternalParameterNames() {
        class Counter {
            var count: Int = 0
            func incrementBy(_ amount: Int, numberOfTimes: Int) {
                count += amount * numberOfTimes
            }
        }
        let counter = Counter()
        counter.incrementBy(5, numberOfTimes: 3)
        print("\(counter.count)")
        
        /*  print
         
         15
         
         */
    }
    
    //self屬性
    func testSelfProperty() {
        //self屬性
        struct Point {
            var x = 0.0, y = 0.0
            func isToTheRightOfX(_ x: Double) -> Bool {
                //這裏有內部和外部屬性
                return self.x > x
            }
        }
        let somePoint = Point(x: 4.0, y: 5.0)
        print("\(somePoint.isToTheRightOfX(1.0))")
        
        /*
         
         true
         
         */
    }
    
    //在實例方法中修改值類型
    func testModifyingValueTypesFromWithinInstanceMethods() {
        //由於結構體是值對象,其內部方法沒法修改外部值,爲了讓結構體支持修改結構體內的屬性。
        //方法體前加mutating,讓結構體的實例方法能夠修改結構體中的值
        struct Point {
            var x = 0.0, y = 0.0
            mutating func moveByX(_ deltaX: Double, y deltaY: Double) {
                x += deltaX
                y += deltaY
            }
        }
        var somePoint = Point(x: 1.0, y: 1.0)
        somePoint.moveByX(2.0, y: 3.0)
        print("(\(somePoint.x), \(somePoint.y))")
        
        let fixedPoint = Point(x: 3.0, y: 3.0)
        print(fixedPoint)
        // 結構體是值對象,使用let常量後,沒法修改內部值
//        fixedPoint.moveByX(2.0, y: 3.0) // 拋錯
        
        /*  print
         
         (3.0, 4.0)
         (Point #1)(x: 3.0, y: 3.0)
         
         */
    }
    
    //自我變異
    func testAssigningToSelfWithinMutatingMethod() {
        //mutating還能夠修改當前結構體和當前枚舉
        //結構體測試
        struct Point {
            var x = 0.0, y = 0.0
            mutating func moveByX(_ deltaX: Double, y deltaY: Double) {
                self = Point(x: x + deltaX, y: y + deltaY)
            }
        }
        var point = Point()
        point.moveByX(1.0, y: 1.0)
        print(point)
        
        //枚舉測試
        enum TriStateSwitch {
            case off, low, high
            mutating func next() {
                switch self {
                case TriStateSwitch.off:
                    self = TriStateSwitch.low
                    print(self)
                case TriStateSwitch.low:
                    self = TriStateSwitch.high
                    print(self)
                case TriStateSwitch.high:
                    self = TriStateSwitch.off
                    print(self)
                }
            }
        }
        var ovenLight = TriStateSwitch.low
        
        ovenLight.next()
        ovenLight.next()
        
        /*
         
         (Point #1)(x: 1.0, y: 1.0)
         high
         off
         
         */
    }
    
    
    //類型方法
    func testTypeMethods() {
        //類
        class SomeClass {
            class func someTypeMethod() {
                // type method implementation goes here
            }
        }
        SomeClass.someTypeMethod()
        
        // 結構體
        struct LevelTracker {
            // static修改屬性,方法體要修改static屬性,方法前要使用static
            static var highestUnlockedLevel = 1
            static func levelIsUnlocked(_ level: Int) -> Bool {
                return level <= highestUnlockedLevel
            }
        }
        print("\(LevelTracker.levelIsUnlocked(2))")
        /*
         
         false
         
         */
    }
}
相關文章
相關標籤/搜索