2014-02-14 8 views
8

Ich versuche, eine NSObject Unterklasse zu machen, die viele Methoden haben wird, die Farben zurückgeben, also möchte ich UIColor zurückgeben, wenn ich für iOS oder NSColor baue, wenn ich baue für OS X.
Dies ist eine Art von Pseudo-Code von dem, was das erwartete Verhalten sein sollte:
Wie wählt man automatisch zwischen NSColor und UIColor für das richtige Build-System? (Mit einem #define, oder etwas)

#define COLOR #if TARGET_OS_IPHONE UIColor #elif TARGET_OS_MAC NSColor #endif 

+ (COLOR *)makeMeColorful; 

ist es möglich, meine so etwas wie, anstatt, 2 Methoden für jede Methode des Objekts zu tun (eine für iOS und eine andere für OS X)?

+1

Siehe http://stackoverflow.com/questions/15323109/creating-an-ios-os-x-cross-platform-class?rq=1 – rmaddy

Antwort

13

Dies ist absolut machbar. SKColor von SpriteKit beispielsweise definiert wie:

#if TARGET_OS_IPHONE 
#define SKColor UIColor 
#else 
#define SKColor NSColor 
#endif 

Und dann wie folgt in Anspruch genommen:

SKColor *color = [SKColor colorWithHue:0.5 saturation:1.0 brightness:1.0 alpha:1.0]; 

Dies geschieht einfach sich die Tatsache zunutze, dass UIColor und NSColor Aktien einige ihrer Klassenmethoden.

+1

Sehr clever Apple. ;) – SevenBits

+2

das war genau das was ich gesucht habe, danke guten sir! –

+1

Beachten Sie, dass 'NSColor' und' UIColor' nicht * alle * ihre API teilen, also müssen Sie vorsichtig sein, keine Methoden aufzurufen, die nur auf dem einen oder dem anderen existieren. – rickster

2

Sie können eine typedef im Präprozessor verwenden bedingte:

#if TARGET_OS_IPHONE 
typedef UIColor MONPlatformColor; 
#elif 
typedef NSColor MONPlatformColor; 
#endif 

Und Ihre API würde deklariert werden:

+ (MONPlatformColor *)makeMeColorful; 
5

Wenn Sie Swift verwenden etwas in den Zeilen von

versuchen
#if os(macOS) 
    typealias Color = NSColor 
#else 
    typealias Color = UIColor 
#endif 

Funktioniert für macOS, iOS, tvOS und watchOS. Mehr unter Swift's preprocessor directives.

+0

Swift verwendet keine Flags wie 'TARGET_OS_IPHONE'. Aber es hat [Ziel-Plattform-Bedingungen] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8 -ID31) wie '#if os (iOS)'. – rickster

+0

Danke, dass du das gezeigt hast! – fpg1503

Verwandte Themen