隨便去問任何人,他們都會告訴你WWDC2014是近年來最為激動的回憶。 整個大會沒有發布任何新硬體,它是一次史無前例的軟體開發人員盛宴。
僅是iOS 8和OS X Yosemite的發布就能讓2014成為蘋果平台劃時代的一年,加上Extension,Continuity,SpriteKit 改進,iOS SceneKit,Metal,HealthKit,Local Authentication和全新的照片架構。更不用說,Xcode和Interface Builder的明顯改觀,重新設計的iTunes Connect,TestFlight,崩潰報告和CloudKit。當然還有oh yeah-Swift。
更棒的是。蘋果放鬆了她的保密協定,也就是說我們可以現在就公開討論這些嶄新的玩具。
這周,我們將撥開iOS 8的雲霧,探討一些所有人都應該知道新API。
從現在開始NSHipster將主要使用Swift編寫範例代碼。夏天結束之前,我們希望能將全部的現存代碼轉換為Swift,並且提供可以切換語言的選項。 NSProcessInfo -isOperatingSystemAtLeastVersion
忘記[[UIDevice currentDevice] systemVersion]和NSFoundationVersionNumber吧, 現在可以用NSProcessInfo -isOperatingSystemAtLeastVersion來確定系統版本。 Swift
import Foundationlet yosemite = NSOperatingSystemVersion(majorVersion: 10, minorVersion: 10, patchVersion: 0)NSProcessInfo().isOperatingSystemAtLeastVersion(yosemite) // false
值得注意的是,在做相容性測試的時候還是應該使用SomeClass.class或respondsToSelector:。 Swift和C中的編譯器宏可以用來根據不同組建組態和目標來選擇代碼。 新的NSFormatter子類
Foundation中嚴重缺失的一項功能就是不能處理重量和長度單位轉換。在iOS 8和OS X Yosemite中,引進了三個新類NSEnergyFormatter,NSMassFormatter和NSLengthFormatter來彌補這一缺失。
這使得NSFormatter子類的數量翻了一倍, 之前只有NSNumberFormatter,NSDateFormatter和NSByteCountFormatter。
雖然這些都是Foundation的子類,但是它們主要都是在HealthKit當中使用。 NSEnergyFormatter
NSEnergyFormatter使用焦作為能量的原始單位,當處理健康資訊時,則使用卡. Swift
let energyFormatter = NSEnergyFormatter()energyFormatter.forFoodEnergyUse = truelet joules = 10_000.0println(energyFormatter.stringFromJoules(joules)) // "2.39 Cal"
NSMassFormatter
雖然品質是物質存在的基本單位, 在HealthKit中,它主要指的是身體重量. Swift
let massFormatter = NSMassFormatter()let kilograms = 60.0println(massFormatter.stringFromKilograms(kilograms)) // "132 lb"
NSLengthFormatter
NSFormatter的最後一個新子類是NSLengthFormatter. 我們可以把它想象為MKDistanceFormatter的加強版。 Swift
let lengthFormatter = NSLengthFormatter()let meters = 5_000.0println(lengthFormatter.stringFromMeters(meters)) // "3.107 mi"
CMPedometer
沿著iOS 8的健康路線, CMStepCounter被重新設計了. CMPedometer作為它的改良版本不僅可以即時擷取離散的點資料,並且可以同時跟蹤腳步和距離,甚至計算總共爬了多少級樓梯。
M7晶片真是功能強大. Swift
import CoreMotionlet lengthFormatter = NSLengthFormatter()let pedometer = CMPedometer()pedometer.startPedometerUpdatesFromDate(NSDate(), withHandler: { data, error in if !error { println("Steps Taken: \(data.numberOfSteps)") let distance = data.distance.doubleValue println("Distance: \(lengthFormatter.stringFromMeters(distance))") let time = data.endDate.timeIntervalSinceDate(data.startDate) let speed = distance / time println("Speed: \(lengthFormatter.stringFromMeters(speed)) / s") }})
CMAltimeter
在支援的裝置上,CMAltimeter可以讓CMPedometer的floorsAscended,floorsDescended資料更加精準: Swift
import CoreMotionlet altimeter = CMAltimeter()if CMAltimeter.isRelativeAltitudeAvailable() { altimeter.startRelativeAltitudeUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: { data, error in if !error { println("Relative Altitude: \(data.relativeAltitude)") } })}
CLFloor
CLFloor的引入展示了蘋果進軍室內導航的宏偉計劃,樓層資訊將扮演著重要的角色。 Swift
import CoreLocationclass LocationManagerDelegate: NSObject, CLLocationManagerDelegate { func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) { let location: CLLocation? = locations[0] as? CLLocation if let floor: CLFloor? = location?.floor { println("Current Floor: \(floor?.level)") } }}let manager = CLLocationManager()manager.delegate = LocationManagerDelegate()manager.startUpdatingLocation()
HKStatistics
作為一個架構,HealthKit包含著大量的子類和常量。要想全部理解,HKStatistics是一個很好的開始。
HealthKit管理著所有的生理資訊,例如:心率,攝取熱量,血氧等等,並且通過統一的API彙總在一起。
下面這個例子示範了如何從一天的連續資料中,挖掘和擷取單獨的資料: Swift
import HealthKitlet collection: HKStatisticsCollection? = ...let statistics: HKStatistics? = collection!.statisticsForDate(NSDate())for item: AnyObject in statistics!.sources { if let source = item as? HKSource { if let quantity: HKQuantity = statistics!.sumQuantityForSource(source) { if quantity.isCompatibleWithUnit(HKUnit.gramUnitWithMetricPrefix(.Kilo)) { let massFormatter = NSMassFormatter() let kilograms = quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(.Kilo)) println(massFormatter.