2015-09-24 8 views
17

Zaktualizowałem do Swift 2 i Xcode 7 i uruchomiłem narzędzie do migracji. Potem mam mnóstwo błędów. Jeden Utknąłem na to jestNie można wywołać wartości typu niefunkcyjnego '((powodzenie: Bool, błąd: NSError?) Throws -> Void)?)

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

Błąd znajduje się na zakończeniu (sukces: false, błąd & błędu)

Wszelkie myśli?

Odpowiedz

27

Telefonujesz zamknięcie tak:

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

completion jest opcjonalny, więc można nazwać jako:

completion?(success: false, error: error) 

Zanotować ?. Eliminuje to również konieczność stosowania if completion != nil ....

-

Zauważyłem, że pan zdefiniował zamknięcie tak, że rzuca błędów. Jeśli to rzeczywiście tak jest, to trzeba coś jak do - try - catch bloku:

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

Albo to, albo zmienić zamknięcie tak, że nie rzucać błędów. To dość ciekawy wzór.

-

Trzeba również linię, która mówi

var error = NSError.self 

Nie wiem, co się z zamiarem, że jest. Jaki błąd próbujesz przekazać z powrotem do zamknięcia?

Jeśli naprawdę chciał stworzyć własną NSError obiekt, możesz zrobić coś takiego:

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

Tak naprawia pierwszy błąd, ale potem wprowadza nowy. "Nie można przekonwertować wartości typu" inout NSError.Type "na oczekiwany typ argumentu" NSError? " – mosaic6

+0

Proponuję podzielić się tym, co błędy. – Rob

+0

Dzięki @Rob. Usunięcie błędu w zamknięciu działa. Nie jestem w 100% zgodny z tym wzorem. Przejmuję projekt i właśnie nad tym pracuję. Miej oko na moją nazwę użytkownika Będę miał wiele więcej pytań ... – mosaic6

0

I był już bardzo podobny komunikat o błędzie do zupełnie innego powodu.

Cannot call value of non-function type CLLocationCoordinate2D?

pisałam kod jako takie:

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

Co było głupie. Brakowało mi samego konstruktora. Prawidłowa wersja znajduje się poniżej.

secondCoord = CLLocationCoordinate2D(latitude: secondLongLat.0, longitude: secondLongLat.1) 
Powiązane problemy