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

17

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

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

Любые мысли?

    
задан mosaic6 24.09.2015 в 16:39
источник

2 ответа

27

Вы вызываете закрытие так:

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

completion не является обязательным, поэтому вы бы назвали его как:

completion?(success: false, error: error)

Обратите внимание на ? . Это также устраняет необходимость в if completion != nil ... .

-

Я заметил, что вы определили закрытие так, чтобы оно выдавало ошибки. Если это действительно так, вам нужно что-то вроде do - try - catch block:

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: "")])
    
ответ дан Rob 24.09.2015 в 16:44
источник
  • Да, это исправляет первую ошибку, но затем вводит новую. 'Невозможно преобразовать значение типа' inout NSError.Type 'в ожидаемый тип аргумента' NSError? ' –  mosaic6 24.09.2015 в 16:45
  • Я предлагаю вам поделиться своими ошибками. –  Rob 24.09.2015 в 16:45
  • Спасибо @Rob. Удаление ошибки в закрытии работает. Для меня это не 100%. Я беру на себя проект, и с этим я работаю. Следите за моим именем пользователя. У меня будет еще много вопросов .... –  mosaic6 24.09.2015 в 16:58
  • Я рассмотрю ссылку. –  mosaic6 24.09.2015 в 17:07
0

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

  

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

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

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

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

secondCoord = CLLocationCoordinate2D(latitude: secondLongLat.0, longitude: secondLongLat.1)
    
ответ дан Honey 07.11.2016 в 12:32
источник