From 8cce995887e8552fd42cb1e2cfb5dcf092716bff Mon Sep 17 00:00:00 2001 From: AceVest Date: Mon, 13 Mar 2017 23:54:04 +0800 Subject: [PATCH] ... --- .../Methods.xcplaygroundpage/Contents.swift | 179 ++++++++++++++++++ .../Contents.swift | 84 +++++++- .../AcePlay.playground/contents.xcplayground | 1 + .../UserInterfaceState.xcuserstate | Bin 21297 -> 22111 bytes 4 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 learn/AcePlay/AcePlay.playground/Pages/Methods.xcplaygroundpage/Contents.swift diff --git a/learn/AcePlay/AcePlay.playground/Pages/Methods.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Methods.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..745b406 --- /dev/null +++ b/learn/AcePlay/AcePlay.playground/Pages/Methods.xcplaygroundpage/Contents.swift @@ -0,0 +1,179 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, playground" + +//: [Next](@next) + +class Counter { + var count = 0 + + func increment() { + count += 1 + } + + func increment(by amount: Int) { + count += amount + } + + func reset() { + count = 0 + } +} + +var counter = Counter() + +counter.increment() +print(counter.count) +counter.increment(by: 100) +print(counter.count) +counter.reset() +print(counter.count) + +struct Point { + var x = 0.0, y = 0.0 + // 结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改,如果要修改将关键字mutating 放到方法的func关键字之前 + mutating func move(x deltaX: Double, y deltaY: Double) { + self.x += deltaX + self.y += deltaY + } + + // 可变方法能够赋给隐含属性self一个全新的实例 + mutating func moveTo(x deltaX: Double, y deltaY: Double) { + self = Point(x: deltaX, y: deltaY) + } + var description: String { + get { + return "Point(\(x), \(y))" + } + } +} + + +var point = Point() +print(point.description) +point.move(x: 1, y: 7) +print(point.description) +point.move(x: 8, y: 4) +print(point.description) +point.moveTo(x: 9, y: 9) +print(point.description) + + +// 枚举的可变方法可以把self设置为同一枚举类型中不同的成员 +enum TriStateSwitch: String { + case Off + case Low + case High + + mutating func next() { + switch self { + case .Off: + self = .Low + case .Low: + self = .High + case .High: + self = .Off + } + } + + var description: String { + return "Current State: \(self.rawValue)" + } +} + +var ovenLight = TriStateSwitch.High +print(ovenLight.description) +ovenLight.next() +print(ovenLight.description) +ovenLight.next() +print(ovenLight.description) +ovenLight.next() +print(ovenLight.description) + +// 类型方法 +class SomeClass { + // static & class 加在func前都是定义类型方法的关键字 + // 不同的是static的不能被子类重写该方法 + // 而class则可以 + static func descV1() -> String { + return "BaseDescV1" + } + class func descV2() -> String { + return "BaseDescV2" + } +} + +class SomeDerivedClass: SomeClass { + /* + 取消注释会编译错误 + override static func descV1() -> String { + return "BaseDescV1" + } + */ + override class func descV2() -> String { + return "DerivedDescV2" + } +} + +print(SomeClass.descV1()) +print(SomeClass.descV2()) +print(SomeDerivedClass.descV1()) +print(SomeDerivedClass.descV2()) + + +class LevelTracker { + static var highestUnlockedLevel = 1 + var currentLevel = 1 + + static func unlock(_ level: Int) { + if level > highestUnlockedLevel { + highestUnlockedLevel = level + } + } + + static func isUnlocked(_ level: Int) -> Bool { + return level <= highestUnlockedLevel + } + + @discardableResult // 可以忽略返回值,不会产生警告 + func advance(to level: Int) -> Bool { + if LevelTracker.isUnlocked(level) { + currentLevel = level + return true + } else { + return false + } + } +} + +class Player { + var tracker = LevelTracker() + let playerName: String + + init(name: String) { + self.playerName = name + } + + func complete(level: Int) { + LevelTracker.unlock(level) + tracker.advance(to: level) + } +} + + +var player = Player(name: "Ace") +player.complete(level: 1) +player.complete(level: 2) +if player.tracker.advance(to: 3) { + print("player is now on level 3") +} else { + print("level 3 has not yet been unlocked") +} +player.complete(level: 3) +if player.tracker.advance(to: 3) { + print("- player is now on level 3") +} else { + print("- level 3 has not yet been unlocked") +} diff --git a/learn/AcePlay/AcePlay.playground/Pages/Properties.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Properties.xcplaygroundpage/Contents.swift index d343e4d..be3145e 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Properties.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Properties.xcplaygroundpage/Contents.swift @@ -51,7 +51,6 @@ print("the DataImporter instance for the importer property has not yet been crea dataManager.importer - printLine("Computed Properties") struct Point { @@ -67,6 +66,7 @@ struct Rect { var origin = Point() var size = Size() + // 必须使用 var 关键字定义计算属性,包括只读计算属性,因为它们的值不是固定的 var center: Point { get { var p = Point() @@ -81,7 +81,7 @@ struct Rect { } /* - //set 有更简洁的写法,set重命名参数的话默认参数名为newValue + //set 有更简洁的写法,set重命名参数的话默认参数名为newValue set { origin.x = newValue.x - size.width/2 @@ -119,3 +119,83 @@ class Cuboid { let fourByFiveByTwo = Cuboid(width:4.0, height:5.0, depth:2.0) print(fourByFiveByTwo.volume) + + +// 属性观察器 +class StepCounter +{ + var totalSteps: Int = 0 { + // 默认的分别是newValue & oldValue + willSet(newValue) { + print("About to set totalSteps to \(newValue)") + } + + didSet { + if totalSteps > oldValue { + print("Added \(totalSteps-oldValue) steps") + } + } + } + + var serialNumber: String = "0000-00000-0000000-000" { + // 不想用newValue & oldValue 可以命名为别的方法 + willSet(newSerialNumber) { + print("New serial number \(newSerialNumber)") + } + + didSet(oldSerialNumber) { + print("Old serial number \(oldSerialNumber)") + } + } +} + + +let stepCounter = StepCounter() + +stepCounter.totalSteps = 100 +stepCounter.totalSteps = 300 +stepCounter.totalSteps = 657 +stepCounter.totalSteps = 257 +stepCounter.serialNumber = "0010-23873-83F123A-ECA" +stepCounter.serialNumber = "10A0-8376C-247232E-EST" + + +// 类型属性 +struct SomeStructure { + static var storedType = "Structure" + static var computedType: Int { + return 1; + } +} + +enum SomeEnumeration { + static var v: String = "ComputedEnumeration" + static var storedType = "Enumeration" + static var computedType: String { + get { + return "get" + v + } + + set(v) { + self.v = v + } + } +} + +class SomeClass { + static var storedType = "Class" + static var computedType: String { + return "ComputedClass" + } +} + +print(SomeStructure.storedType) +print(SomeEnumeration.storedType) +print(SomeClass.storedType) + +print(SomeStructure.computedType) +print(SomeEnumeration.computedType) +SomeEnumeration.computedType = "ComputedEnumerationV2" +print(SomeEnumeration.computedType) +print(SomeClass.computedType) + diff --git a/learn/AcePlay/AcePlay.playground/contents.xcplayground b/learn/AcePlay/AcePlay.playground/contents.xcplayground index a6a057a..52e276f 100644 --- a/learn/AcePlay/AcePlay.playground/contents.xcplayground +++ b/learn/AcePlay/AcePlay.playground/contents.xcplayground @@ -9,5 +9,6 @@ + \ No newline at end of file diff --git a/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate b/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate index 4a9ccd94eec012a448adcb0d43fe1d392dd1d5bc..5d871e6e33c3a54256d6fa30308f8be2d4ec59ea 100644 GIT binary patch delta 11285 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 Of6-riKO5c)&ip^j#(y6G delta 10849 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 IpG~#@5A#g=cmMzZ -- 2.44.0