web-dev-qa-db-fra.com

Impossible d'appeler une valeur de type non-fonction '(((succès: Bool, erreur: NSError?) Lève -> vide)?

J'ai mis à jour Swift 2 et Xcode 7 et exécuté l'outil de migration. Ensuite, j'ai eu une tonne d'erreurs. Je suis coincé sur celui-ci

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)
        }
    }
}

L'erreur est en cours d'exécution (succès: faux, erreur et erreur)

Des pensées?

17
mosaic6

Vous appelez la fermeture comme suit:

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

La completion étant optionnelle, vous l'appelleriez ainsi:

completion?(success: false, error: error)

Notez le ?. Cela élimine également le besoin de if completion != nil ....

Je remarque que vous avez défini la fermeture de manière à générer des erreurs. Si c'est vraiment le cas, vous avez besoin de quelque chose comme un bloc do-try-catch:

do {
    try completion?(success:false, error: error)
} catch let completionError {
    print(completionError)
}

Soit ça, soit changer la fermeture pour éviter les erreurs. C'est un motif assez curieux.

-

Vous avez également une ligne qui dit 

var error = NSError.self

Je ne sais pas quelle est votre intention. Quelle erreur essayez-vous de transmettre à la fermeture?

Si vous voulez vraiment créer votre propre objet NSError, vous pouvez faire quelque chose comme:

let error = NSError(domain: "com.domain.app", code: 1, userInfo: [NSLocalizedDescriptionKey : NSLocalizedString("Health Data Not Available", comment: "")])
27
Rob

Je recevais un message d'erreur très similaire pour une raison complètement différente. 

Impossible d'appeler la valeur de type non-fonction CLLocationCoordinate2D?

J'ai écrit mon code en tant que tel: 

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

Ce qui était idiot. Il me manquait le constructeur lui-même. La version correcte est ci-dessous.

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