2016-05-10 13 views
4

Nehmen wir an, wir haben eine Swift-Klasse mit einem Initialisierer, der einen Fehler auslösen kann. Diese Klasse muss in Objective-C Code-Basis (NSObject Unterklasse) verwendet werden:Wie überbrückbare Swift Initialisierer mit Objective-C-Code?

import Foundation 

enum EvenError : ErrorType { 
    case NonEvenNumber 
} 

class FooEven : NSObject { 
    var evenNumber : UInt 

    init(evenNumber: UInt) throws { 
     guard evenNumber % 2 == 0 else { 
      throw EvenError.NonEvenNumber 
     } 
     self.evenNumber = evenNumber 
    } 
} 

Produziert Warnung Kompilation:

<unknown>:0: warning: no calls to throwing functions occur within 'try' expression 

Ich kann in zwei Möglichkeiten, um diese Warnung arbeiten:

  • von throwable ersetzen Initialisierer (init... -> throws) mit einem fehlbaren (init?)
  • Aufgeben auf Subklassen von NSObject

Doch diese Art und Weise werde ich:

  • lose Informationen über einen Fehler verursacht die Ausnahme,
  • haben Fälle von FooEven optionals zu machen und/oder behandeln viele: if let fooEven = FooEven.init() {...} Aussagen
  • ... oder ich werde es nicht in bestehende Objective-C Code zu verwenden in der Lage:

enter image description here

Keines der obigen erfüllt meine Bedürfnisse/Anforderungen.

Gibt es eine andere Möglichkeit, diese Warnung zu entfernen, ohne Informationen über den Fehler zu verlieren?

+0

Können Sie eine Closure verwenden, die ein NSError-Objekt enthält, um die Fehlerinformationen zu erfassen? Ich weiß nicht viel über Swift, Entschuldigung. – fsb

+0

Ich habe keine Antwort für dich, aber hast du das jemals gelöst? In das gleiche Problem hineinlaufen. – chrismanderson

+0

Leider nicht – Lukasz

Antwort

2

Eine weitere Problemumgehung besteht darin, einen Initializer für das Werfen von Convenience hinzuzufügen, der den nicht von Ihnen gewidmeten Initialisierer aufruft.

1

Dies ist a bug in the Swift compiler und ist in Xcode 8 behoben. Wenn Sie Xcode aktualisieren, wird diese Warnung entfernt.

In der Zwischenzeit können Sie am Ende Ihres Initialisierers super.init() anrufen, wodurch die Warnung ebenfalls verschwindet.