在HealthKit中,數(shù)據(jù)是最核心的元素。通過分析數(shù)據(jù),人們可以看到相干的健康信息。例如,通過統(tǒng)計步數(shù)數(shù)據(jù),人們可以知道1天走的步數(shù)。本章將主要講授HealthKit數(shù)據(jù)構(gòu)成的方式,和如何規(guī)范的表達1個數(shù)據(jù)。
在HealthKit中,數(shù)據(jù)都是與單位和值組成的,如圖2.1所示。此圖為1個睡眠分析的截圖。在此圖中59m就代表了1個數(shù)據(jù)。其中m為單位,59為基于單位的數(shù)值。本節(jié)將講授數(shù)據(jù)的創(chuàng)建、判斷、比較和獲得等內(nèi)容。
圖2.1 睡眠分析
在HealthKit中數(shù)據(jù)都是由單位和值構(gòu)成的。在使用數(shù)據(jù)之前,首先需要對數(shù)據(jù)進行創(chuàng)建。本小節(jié)將講授數(shù)據(jù)創(chuàng)建的兩個步驟:創(chuàng)建單位和創(chuàng)建基于單位的數(shù)據(jù)。
1.創(chuàng)建單位
在HealthKit中,為了讓數(shù)據(jù)具有實際物理意義,所以需要為數(shù)據(jù)中的值指訂單位。HKUnit提供了便捷方法來創(chuàng)建HealthKit支持的所有基本單位。HKUnit是1個類。當(dāng)我們要具體的使用它時,就需要對其進行實例化。實例化HKUnit需要使用到init(fromString:)方法。它可以用來對單位進行創(chuàng)建,并且此單位有1個描寫性的字符串,其語法情勢以下:
convenience init!(fromString string: String!)
其中,string是1個字符串,用來代表單位。此字符串必須要符合HealthKit所支持的所有基本單位。Healthkit所支持的基本單位如附錄B所示。
【示例2⑴:HKUnit-init】下面創(chuàng)建1個以米為單位的對象。代碼以下:
import UIKit
import HealthKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var myunit=HKUnit(fromString: "m") //創(chuàng)建單位對象
println(myunit)
}
……
}
此時運行程序,會看到以下的效果。
m
2.創(chuàng)建基于單位的數(shù)據(jù)
HKQuantity類存儲了給訂單位的值,此值和單位就構(gòu)成了數(shù)據(jù)。和HKUnit類1樣,在使用它時,需要進行實例化。實例化HKQuantity需要使用到init(unit:doubleValue:)方法。它可以用來創(chuàng)建1個quantity(數(shù)量)對象。其語法情勢以下:
convenience init!(unit unit: HKUnit!,
doubleValue value: Double)
其中,unit用來指定1個單位對象;value用來指定基于單位的值,它是1個雙精度類型的數(shù)據(jù)。
【示例2⑵:HKQuantity-init】下面表示某1個人在1段時間內(nèi)所走的路程。代碼以下:
import UIKit
import HealthKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var myunit=HKUnit(fromString: "km") //創(chuàng)建長度單位
var mydistance=HKQuantity(unit: myunit, doubleValue: 10) //創(chuàng)建長度數(shù)據(jù)對象
println("1段時間后,某人行走的路程為:(mydistance)")
}
……
}
此時運行程序,會看到以下的效果。
1段時間后,某人行走的路程為:10 km
比較和判斷是數(shù)據(jù)處理的基本操作。例如,通過比較的操作,可讓用戶找出1組數(shù)據(jù)的最大值。本小節(jié)將詳細講授數(shù)據(jù)的判斷和比較。
1.判斷單位是不是為空
很多的單位有如m/s的情況,如果當(dāng)兩個單位1樣時,此單位就會抵消,變成1個空的單位。為了不這類情況的產(chǎn)生,HealthKit提供了1個isNull()方法。此方法用來判斷創(chuàng)建的單位是不是為空,其語法情勢以下:
func isNull() -> Bool
其中,該方法的返回值類型為布爾類型。當(dāng)Bool為true時,表示創(chuàng)建的單位為空;當(dāng)Bool為false時,表示創(chuàng)建的單位不為空。
【示例2⑶:HKUnit-isNull】下面判斷給定的單位是不是為空。代碼以下:
import UIKit
import HealthKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var unit1:HKUnit=HKUnit(fromString: "m/m")
//判斷
if((unit1.isNull()) == true){
println("unit1對象為空")
}else{
println("unit1對象不為空")
}
var unit2=HKUnit(fromString: "m/s")
//判斷
if((unit2.isNull()) == true){
println("unit2對象為空")
}else{
println("unit2對象不為空")
}
}
……
}
此時運行程序,會看到以下的效果。
unit1對象為空
unit2對象不為空
2.判斷數(shù)據(jù)的兼容性
同類型單位和單位之間是可以進行轉(zhuǎn)換的,如以米為單位的數(shù)據(jù)和厘米為單位的數(shù)據(jù),以公斤為單位的數(shù)據(jù)和以克為單位的數(shù)據(jù)等。而兼容性就是用來判斷數(shù)據(jù)和提供的單位之間是不是可以進行轉(zhuǎn)換。在HealthKit中isCompatibleWithUnit(_:)方法可以用來對數(shù)據(jù)的兼容性進行判斷,其語法情勢以下:
func isCompatibleWithUnit(_ unit: HKUnit!) -> Bool
其中,unit用來指定1個單位對象。該方法的返回值類型為布爾類型。當(dāng)Bool為true時,表示quantity對象和提供的單位相兼容;當(dāng)Bool為false時,表示quantity對象和提供的單位不兼容。
【示例2⑷:HKQuantity-isCompatibleWithUnit】判斷某人行走的路程是不是可以與給定的單位進行轉(zhuǎn)換。代碼以下:
import UIKit
import HealthKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var unit1=HKUnit(fromString: "km") //創(chuàng)建1個長度單位
var distance=HKQuantity(unit: unit1, doubleValue: 10) //創(chuàng)建1個長度數(shù)據(jù)對象
var unit2=HKUnit(fromString: "m") //創(chuàng)建第2個長度單位
//判斷兼容
if(distance.isCompatibleWithUnit(unit2)){
println("distance與unit2兼容")
}else{
println("distance與unit2不兼容")
}
var unit3=HKUnit(fromString: "s") //創(chuàng)建1個時間單位
//判斷兼容
if(distance.isCompatibleWithUnit(unit3)){
println("distance與unit3兼容")
}else{
println("distance與unit3不兼容")
}
……
}
此時運行程序,會看到以下的效果。
distance與unit2兼容
distance與unit3不兼容
3.比較數(shù)據(jù)
同簡單的數(shù)值1樣,數(shù)據(jù)也能夠進行比較的。在HealthKit中提供了compare(_:)方法,可以實現(xiàn)數(shù)據(jù)的比較功能,其語法情勢以下:
func compare(_ quantity: HKQuantity!) -> NSComparisonResult
其中,quantity用來指定1個數(shù)量對象。該方法的返回值類型為NSComparisonResult枚舉類型,其語法情勢以下:
enum NSComparisonResult : Int {
case OrderedAscending
case OrderedSame
case OrderedDescending
}
其中,OrderedAscending表示左側(cè)的數(shù)據(jù)小于右側(cè)的數(shù)據(jù);OrderedSame表示兩個數(shù)據(jù)相等;OrderedDescending表示右側(cè)的數(shù)據(jù)小于左側(cè)的數(shù)據(jù)。
【示例2⑸:HKQuantity-compare】下面對1個人4天的行走距離進行比較。代碼以下:
import UIKit
import HealthKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var unit1=HKUnit(fromString: "km") //創(chuàng)建1個千米單位
var distance1=HKQuantity(unit: unit1, doubleValue: 10) //創(chuàng)建第1天行走距離對象
var unit2=HKUnit(fromString: "m") //創(chuàng)建1個米單位
var distance2=HKQuantity(unit: unit2, doubleValue: 10000) //創(chuàng)建第2天行走距離對象
var distance3=HKQuantity(unit: unit2, doubleValue: 10) //創(chuàng)建第3天行走距離對象
var distance4=HKQuantity(unit: unit2, doubleValue: 500) //創(chuàng)建第4天行走距離對象
//比較大小
if(distance1.compare(distance2)==NSComparisonResult.OrderedSame){
println("兩天所走的路程1樣")
}
//比較大小
if(distance3.compare(distance2)==NSComparisonResult.OrderedAscending){
println("第2天走的要比第3天走的要多")
}
//比較大小
if(distance4.compare(distance3)==NSComparisonResult.OrderedDescending){
println("第3天走的要比第4天走的要少")
}
}
……
}
此時運行程序,會看到以下的效果。
兩天所走的路程1樣
第2天走的要比第3天走的要多
第3天走的要比第4天走的要少
由于數(shù)據(jù)是由單位和數(shù)值組成的。有的時候,需要單獨獲得單位和數(shù)值。本小節(jié)將主要講授這兩個功能。
1.獲得單位
在創(chuàng)建單位時,我們提到了init(fromString:)方法,它可以用來對單位進行創(chuàng)建,并且此單位有1個描寫性的字符串,unitString屬性的功能就是用來獲得這個描寫性的字符串。其語法情勢以下:
var unitString: String! { get }
【示例2⑹:HKUnit-unitString】創(chuàng)建1個單位,并獲得單位中描寫性的字符串。代碼以下:
import UIKit
import HealthKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var unit=HKUnit(fromString: "km")
println(unit.unitString) //獲得字符串
}
……
}
此時運行程序,會看到以下的效果。
km
2.獲得基于單位的值
有時我們只想查看數(shù)據(jù)中的數(shù)值,而不是全部數(shù)據(jù),需要使用到doubleValueForUnit(_:)方法。其語法情勢以下:
func doubleValueForUnit(_ unit: HKUnit!) -> Double
其中,unit用來指定1個單位對象。該方法的返回值類型為雙精度類型。
【示例2⑺:HKQuantity-doubleValueForUnit】獲得不同單位數(shù)據(jù)中的值。代碼以下:
import UIKit
import HealthKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var unit1=HKUnit(fromString: "km")
//創(chuàng)建1
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈