参数类型 '[HKCategoryType?]' 不符合预期的类型 'Hashable'

Posted

技术标签:

【中文标题】参数类型 \'[HKCategoryType?]\' 不符合预期的类型 \'Hashable\'【英文标题】:Argument type '[HKCategoryType?]' does not conform to expected type 'Hashable'参数类型 '[HKCategoryType?]' 不符合预期的类型 'Hashable' 【发布时间】:2016-09-23 17:54:29 【问题描述】:

我正在尝试使用代码为 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 的教程?

【问题讨论】:

【参考方案1】:

链接的文章不是从 ArrayLiteral 创建 Set 的好例子。

您需要将Set<HKSampleType> 传递给requestAuthorization(toShare:read:)(该方法已在 Swift 3 中重命名),Swift 不擅长推断集合类型。

因此,您最好明确声明healthKitTypesToWritehealthKitTypesToRead 的每种类型。

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:)

【讨论】:

以上是关于参数类型 '[HKCategoryType?]' 不符合预期的类型 'Hashable'的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC -- 获得请求参数(@RequestBody)基本类型参数POJO类型参数数组类型参数集合类型参数(POJOajax)

颤振列表错误参数类型'List'不能分配给参数类型'String'

获取错误“未知”类型的参数不能分配给“错误”类型的参数 |空值'

给定传递给它的参数类型,如何确定函数参数的类型?

参数类型“Type”不能分配给参数类型“FirebaseUser”

类型提示,其中一个参数是另一个参数的类型