在HealthKit中,数据是最核心的元素。通过分析数据,人们可以看到相干的健康信息。例如,通过统计步数数据,人们可以知道1天走的步数。本章将主要讲授HealthKit数据构成的方式,和如何规范的表达1个数据。
在HealthKit中,数据都是与单位和值组成的,如图2.1所示。此图为1个睡眠分析的截图。在此图中59m就代表了1个数据。其中m为单位,59为基于单位的数值。本节将讲授数据的创建、判断、比较和获得等内容。
图2.1 睡眠分析
在HealthKit中数据都是由单位和值构成的。在使用数据之前,首先需要对数据进行创建。本小节将讲授数据创建的两个步骤:创建单位和创建基于单位的数据。
1.创建单位
在HealthKit中,为了让数据具有实际物理意义,所以需要为数据中的值指订单位。HKUnit提供了便捷方法来创建HealthKit支持的所有基本单位。HKUnit是1个类。当我们要具体的使用它时,就需要对其进行实例化。实例化HKUnit需要使用到init(fromString:)方法。它可以用来对单位进行创建,并且此单位有1个描写性的字符串,其语法情势以下:
convenience init!(fromString string: String!)
其中,string是1个字符串,用来代表单位。此字符串必须要符合HealthKit所支持的所有基本单位。Healthkit所支持的基本单位如附录B所示。
【示例2⑴:HKUnit-init】下面创建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") //创建单位对象
println(myunit)
}
……
}
此时运行程序,会看到以下的效果。
m
2.创建基于单位的数据
HKQuantity类存储了给订单位的值,此值和单位就构成了数据。和HKUnit类1样,在使用它时,需要进行实例化。实例化HKQuantity需要使用到init(unit:doubleValue:)方法。它可以用来创建1个quantity(数量)对象。其语法情势以下:
convenience init!(unit unit: HKUnit!,
doubleValue value: Double)
其中,unit用来指定1个单位对象;value用来指定基于单位的值,它是1个双精度类型的数据。
【示例2⑵:HKQuantity-init】下面表示某1个人在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: "km") //创建长度单位
var mydistance=HKQuantity(unit: myunit, doubleValue: 10) //创建长度数据对象
println("1段时间后,某人行走的路程为:(mydistance)")
}
……
}
此时运行程序,会看到以下的效果。
1段时间后,某人行走的路程为:10 km
比较和判断是数据处理的基本操作。例如,通过比较的操作,可让用户找出1组数据的最大值。本小节将详细讲授数据的判断和比较。
1.判断单位是不是为空
很多的单位有如m/s的情况,如果当两个单位1样时,此单位就会抵消,变成1个空的单位。为了不这类情况的产生,HealthKit提供了1个isNull()方法。此方法用来判断创建的单位是不是为空,其语法情势以下:
func isNull() -> Bool
其中,该方法的返回值类型为布尔类型。当Bool为true时,表示创建的单位为空;当Bool为false时,表示创建的单位不为空。
【示例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.判断数据的兼容性
同类型单位和单位之间是可以进行转换的,如以米为单位的数据和厘米为单位的数据,以公斤为单位的数据和以克为单位的数据等。而兼容性就是用来判断数据和提供的单位之间是不是可以进行转换。在HealthKit中isCompatibleWithUnit(_:)方法可以用来对数据的兼容性进行判断,其语法情势以下:
func isCompatibleWithUnit(_ unit: HKUnit!) -> Bool
其中,unit用来指定1个单位对象。该方法的返回值类型为布尔类型。当Bool为true时,表示quantity对象和提供的单位相兼容;当Bool为false时,表示quantity对象和提供的单位不兼容。
【示例2⑷:HKQuantity-isCompatibleWithUnit】判断某人行走的路程是不是可以与给定的单位进行转换。代码以下:
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") //创建1个长度单位
var distance=HKQuantity(unit: unit1, doubleValue: 10) //创建1个长度数据对象
var unit2=HKUnit(fromString: "m") //创建第2个长度单位
//判断兼容
if(distance.isCompatibleWithUnit(unit2)){
println("distance与unit2兼容")
}else{
println("distance与unit2不兼容")
}
var unit3=HKUnit(fromString: "s") //创建1个时间单位
//判断兼容
if(distance.isCompatibleWithUnit(unit3)){
println("distance与unit3兼容")
}else{
println("distance与unit3不兼容")
}
……
}
此时运行程序,会看到以下的效果。
distance与unit2兼容
distance与unit3不兼容
3.比较数据
同简单的数值1样,数据也能够进行比较的。在HealthKit中提供了compare(_:)方法,可以实现数据的比较功能,其语法情势以下:
func compare(_ quantity: HKQuantity!) -> NSComparisonResult
其中,quantity用来指定1个数量对象。该方法的返回值类型为NSComparisonResult枚举类型,其语法情势以下:
enum NSComparisonResult : Int {
case OrderedAscending
case OrderedSame
case OrderedDescending
}
其中,OrderedAscending表示左侧的数据小于右侧的数据;OrderedSame表示两个数据相等;OrderedDescending表示右侧的数据小于左侧的数据。
【示例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") //创建1个千米单位
var distance1=HKQuantity(unit: unit1, doubleValue: 10) //创建第1天行走距离对象
var unit2=HKUnit(fromString: "m") //创建1个米单位
var distance2=HKQuantity(unit: unit2, doubleValue: 10000) //创建第2天行走距离对象
var distance3=HKQuantity(unit: unit2, doubleValue: 10) //创建第3天行走距离对象
var distance4=HKQuantity(unit: unit2, doubleValue: 500) //创建第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天走的要少
由于数据是由单位和数值组成的。有的时候,需要单独获得单位和数值。本小节将主要讲授这两个功能。
1.获得单位
在创建单位时,我们提到了init(fromString:)方法,它可以用来对单位进行创建,并且此单位有1个描写性的字符串,unitString属性的功能就是用来获得这个描写性的字符串。其语法情势以下:
var unitString: String! { get }
【示例2⑹:HKUnit-unitString】创建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.获得基于单位的值
有时我们只想查看数据中的数值,而不是全部数据,需要使用到doubleValueForUnit(_:)方法。其语法情势以下:
func doubleValueForUnit(_ unit: HKUnit!) -> Double
其中,unit用来指定1个单位对象。该方法的返回值类型为双精度类型。
【示例2⑺:HKQuantity-doubleValueForUnit】获得不同单位数据中的值。代码以下:
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") //创建1