我正在尝试使用代码请求对healthkit中的类别进行授权:
let healthKitStore: HKHealthStore = HKHealthStore()
let healthKitTypesToWrite = Set(arrayLiteral:[
HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifierMindfulSession)
])
healthKitStore.requestAuthorizationToShareTypes(healthKitTypesToWrite, readTypes: healthKitTypesToRead) { (success, error) -> Void in
if( completion != nil )
{
completion(success:success,error:error)
}
}
来自https://www.raywenderlich.com/86336/ios-8-healthkit-swift-getting-started。
然而,当我这样做时,我得到了:
参数类型' [HKCategoryType?]'不符合预期的类型 '可哈希'
如何在Healthkit中保存类别,并且通常是一个专门用于HKCategoryType的教程,还有HKCategoryTypeIdentifierMindfulSession?
答案 0 :(得分:6)
链接文章不是从ArrayLiteral创建Set的好例子。
您需要将Set<HKSampleType>
传递给requestAuthorization(toShare:read:)
(该方法已在Swift 3中重命名),而Swift并不擅长推断集合类型。
因此,您最好明确声明每种类型的healthKitTypesToWrite
和healthKitTypesToRead
。
let healthKitTypesToWrite: Set<HKSampleType> = [
HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.mindfulSession)!
]
let healthKitTypesToRead: Set<HKObjectType> = [
//...
]
healthKitStore.requestAuthorization(toShare: healthKitTypesToWrite, read: healthKitTypesToRead) { (success, error) -> Void in
completion?(success, error)
}
通过将ArrayLiteral提供给某个Set
类型,Swift会尝试将ArrayLiteral转换为Set
,并在内部调用Set.init(arrayLiteral:)
。您通常无需直接使用Set.init(arrayLiteral:)
。