Невозможно вызвать значение нефункционного типа '((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)
}
}
}
Ошибка завершена (успех: ложь, ошибка и ошибка)
Любые мысли?
Ответы
Ответ 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)