2014-10-01 5 views
6

Um Kreuzkompatibilität bereitzustellen, ermöglicht Swift die Generierung eines Bridging-Headers, sodass Objective-C mit Swift-Klassen kommunizieren kann.Soll eine Swift-Klasse vorangestellt werden, um mögliche Objective-C-Kompatibilitätsprobleme zu vermeiden

Aufgrund von Swifts wundervollem Namespacing müssen wir uns nicht länger darum kümmern, dass wir unsere Swift-Dateien als Namespace voranstellen. Ein UIView zum Beispiel ist implizit Namespaces wie UIKit.UIView.

Jetzt, da Apple Frameworks drängen, frage ich mich, was die Best Practices sind Header Kollision zu vermeiden, wenn es zwei schnelle Bridging-Header mit den gleichen Symbolen gibt.

Ein Beispiel: Angenommen, wir haben zwei Frameworks, die eine Swift-Klasse namens Downloader deklariert haben. Das Downloader stellt die Schnittstelle bereit: downloadWithURL(url: NSURL)

Generieren eines Bridging-Headers wird eine Downloader-Swift.h-Datei für beide dieser Frameworks ergeben. Dies verursacht eine Kollision. Was sind die besten Praktiken, um dies zu vermeiden?

Antwort

4

Nach Apples Ingenieuren verwendet der Header <#Module Name#>-Swift.h ein Makro, das den Namen mischt, um Konflikte zu vermeiden (siehe WWDC-Video Swift Interoperability In Depth, beginnend bei 45 min, 40 s). Sie gaben ein Beispiel für eine Document Swift Klasse:

SWIFT_CLASS("_TtC5MyApp10Document") 
@interface Document : UIDocument 
// rest of the interface... 

Um Ihren Swift Code, wird die Klasse als MyApp.Document verfügbar sein, wenn MyApp das Modul ist es in so ist, wenn man zwei Swift Klassen derselben haben. Namen aus verschiedenen Modulen kommen - sagen, ist Ihr eigenes und das andere von einem Open-Source Swift Rahmen SomeFramework - sie werden Ihrem Swift-Code als MyApp.Document und SomeFramework.Document ...

auf der Obj-C-Seite verfügbar sein, jedoch Das Importieren dieser zwei Klassen in denselben lexikalischen Bereich führt zu Duplicate interface definition for class 'Document' Compilerfehler. Das ist nur Obj-C ... In den allermeisten Fällen wird dies jedoch kein Problem sein, da Sie diese beiden Klassen weiterhin über die App importieren können, solange sie nicht das Territorium des jeweils anderen verletzen. In der Tat, wie oft möchten Sie MyApp.Document und SomeFramework.Document im selben Modul Ihrer App verwenden? Da wir in schnellere Zeiten ziehen, bin ich nicht sicher, ob dieses spezielle Thema eine bestimmte Strategie im Vergleich zu so vielen dringenden Themen wie Multicore, verteilt, funktional, haptisch, antizipativ, tragbar, autonom, etc ...

rechtfertigt
Verwandte Themen