【问题标题】:Swift: Type of expression is ambiguous without more context斯威夫特:表达式的类型是模棱两可的,没有更多的上下文
【发布时间】:2016-01-24 00:05:39
【问题描述】:
let healthWrite = Set(arrayLiteral:[
    HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex),
    HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned),
    HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning),
    HKQuantityType.workoutType()
])

【问题讨论】:

  • 查找文档。 quantityTypeForIdentifier() 的返回类型是什么? HKQuantityType? 中的问号表示什么?你对可选项和展开了解多少?

标签: swift


【解决方案1】:

构造函数想要一个数组字面量而不是数组,所以你可以用这样的东西来初始化

let healthWrite = Set(arrayLiteral:
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex)!,
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)!,
     HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!,
     HKQuantityType.workoutType()
     )

更多关于数组和数组字面量 https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html

编辑:

让你悲伤的是可选值而不是“[]”

let healthWrite = Set([
            HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex)!,
            HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)!,
            HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!,
            HKQuantityType.workoutType()]
            )

如果您使用guardif let 在创建集合之前检查HKObjectType.quantityTypeForIdentifier 是否实际返回一个值,那就更好了

【讨论】:

  • 可以从一个数组创建一个SetarrayLiteral:根本不需要。
  • 你当然是对的。但是删除括号实际上让编译器建议解开返回值。
  • arrayLiteral 初始化器来自ArrayLiteralConvertible 协议,旨在像这样使用:let healthWrite : Set = [item1, item2, ... ]
猜你喜欢
  • 1970-01-01
  • 2017-04-15
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多