无法调用非函数类型'((success: Bool, error: NSError?) throws -> Void)?)'的值。

18

我已经升级到了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)处。
有什么想法吗?
2个回答

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

是的,这修复了第一个错误,但又引入了一个新的错误。'无法将类型为'inout NSError.Type'的值转换为预期的参数类型'NSError?'。 - mosaic6
谢谢@Rob。修复闭包中的错误有效。我对此模式不是100%确定。我正在接手一个项目,这就是我正在处理的内容。请关注我的用户名,我会有更多问题... - mosaic6
1
我会查看这个链接。 - mosaic6

0

我因为完全不同的原因得到了一个非常相似的错误信息。

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

我编写的代码如下:

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接