【问题标题】:Cannot call value of non-function type '((success: Bool, error: NSError?) throws -> Void)?)无法调用非函数类型的值 '((success: Bool, error: NSError?) throws -> Void)?)
【发布时间】:2015-09-24 14:39:37
【问题描述】:

我更新到 Swift 2 和 Xcode 7 并运行了迁移工具。然后我得到了很多错误。我坚持的一个是这个

func authorizeHealthKit(completion: ((success:Bool, error:NSError?) throws -> Void)?)
{
    // 1. Set the types you want to read from HK Store
    let healthKitTypesToRead = (array:[
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)

        ])

    // 2. Set the types you want to write to HK Store
    let healthKitTypesToWrite = (array:[
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
        ])

    // 3. If the store is not available (for instance, iPad) return an error and don't go on.
    if !HKHealthStore.isHealthDataAvailable()
    {
        var error = NSError.self
        if( completion != nil )
        {
            completion(success:false, error:&error)
        }
        return;
    }

    // 4.  Request HealthKit authorization
    healthKitStore.requestAuthorizationToShareTypes(healthKitTypesToWrite as Set<NSObject>, readTypes: healthKitTypesToRead as Set<NSObject>) { (success, error) -> Void in

        if( completion != nil )
        {
            completion(success:success,error:error)
        }
    }
}

错误正在完成(success:false, error&error)

有什么想法吗?

【问题讨论】:

    标签: ios swift swift2


    【解决方案1】:

    你是这样调用闭包的:

    if completion != nil  {
        completion(success: false, error: error)
    }
    

    completion 是可选的,所以你可以这样称呼它:

    completion?(success: false, error: error)
    

    注意?。它还消除了对if completion != nil ... 的需要。

    --

    我注意到您已经定义了闭包,因此它会引发错误。如果确实如此,那么您需要类似do-try-catch 块:

    do {
        try completion?(success:false, error: error)
    } catch let completionError {
        print(completionError)
    }
    

    要么这样,要么更改闭包以使其不会引发错误。这是一个非常奇怪的模式。

    --

    你还有一行写着

    var error = NSError.self
    

    我不知道你的意图是什么。您试图将什么错误传递回闭包?

    如果您真的想创建自己的 NSError 对象,您可以执行以下操作:

    let error = NSError(domain: "com.domain.app", code: 1, userInfo: [NSLocalizedDescriptionKey : NSLocalizedString("Health Data Not Available", comment: "")])
    

    【讨论】:

    • 是的,它修复了第一个错误,但随后又引入了一个新错误。 '无法将'inout NSError.Type'类型的值转换为预期的参数类型'NSError?'
    • 谢谢@Rob。消除关闭工作中的错误。我不是100%的这种模式。我正在接手一个项目,这就是我正在做的事情。留意我的用户名,我会有更多问题......
    • 我会查看链接。
    【解决方案2】:

    由于完全不同的原因,我收到了非常相似的错误消息。

    不能调用非函数类型CLLocationCoordinate2D的值?

    我的代码是这样写的:

    secondCoord(latitude: secondLongLat.0, longitude: secondLongLat.1)
    

    这是愚蠢的。我错过了构造函数本身。正确的版本如下。

    secondCoord = CLLocationCoordinate2D(latitude: secondLongLat.0, longitude: secondLongLat.1)
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 1970-01-01
      • 2015-12-24
      • 2016-08-19
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      相关资源
      最近更新 更多