无法调用非函数类型的值'((成功:Bool,错误:NSError?)throws - > Void)?)

时间:2015-09-24 14:39:38

标签: ios swift swift2

我更新了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)
        }
    }
}

错误已完成(成功:错误,错误和错误)

有什么想法吗?

2 个答案:

答案 0 :(得分:27)

你是这样调用闭包的:

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

答案 1 :(得分:0)

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

  

无法调用非函数类型CLLocationCoordinate2D的值?

我这样写了我的代码:

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

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

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