Подтвердить что ты не робот

Невозможно вызвать значение нефункционного типа '((success: Bool, error: NSError?) Throws → Void)?)

Я обновился до 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)
        }
    }
}

Ошибка завершена (успех: ложь, ошибка и ошибка)

Любые мысли?

4b9b3361

Ответ 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: "")])

Ответ 2

Я получал очень похожее сообщение об ошибке по совершенно другой причине.

Невозможно вызвать значение нефункционного типа CLLocationCoordinate2D?

Я написал свой код как таковой:

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

Это было глупо. Мне не хватало конструктора. Правильная версия ниже.

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