2014-02-14 1 views
8

색상을 반환하는 많은 메소드가있는 NSObject 하위 클래스를 만들려고합니다. 따라서 iOS 용으로 제작하는 경우 UIColor을 작성하거나 건물에있는 경우 NSColor을 반환하고 싶습니다.
NSColor와 UIColor 중에서 올바른 빌드 시스템을 자동으로 선택하는 방법은 무엇입니까? (#define 등 사용)

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

+ (COLOR *)makeMeColorful; 

은 (대신 내 개체의 방법 각각에 대해이 방법을 만드는 같은 것을 할 수 있습니다 : OS X의
위해이 예상되는 행동이 무엇을해야 의사 코드의 종류는 하나는 iOS 용이고 다른 하나는 OS X 용)?

+1

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

답변

13

이것은 절대적으로 가능합니다. SpriteKit에서 SKColor 예를 들어, 다음과 같이 정의한다 :

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

그리고 다음과 같이 활용 :

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

이것은 단순히 사실을 활용하는 UIColorNSColor주 자신의 클래스 메소드의 일부.

+1

매우 똑똑한 Apple입니다. ;) – SevenBits

+2

정확히 내가 찾고있는 것이 었습니다. 선생님 께 감사드립니다! –

+1

'NSColor'와'UIColor'는 * all * API를 공유하지 않기 때문에 하나 또는 둘 다 존재하는 메소드를 호출하지 않도록주의해야합니다. – rickster

2

조건부 프리 프로세서 내에서 typedef를 사용할 수 있습니다

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

그리고 당신의 API가 선언 될 것입니다 :

+ (MONPlatformColor *)makeMeColorful; 
5

당신은 스위프트가

#if os(macOS) 
    typealias Color = NSColor 
#else 
    typealias Color = UIColor 
#endif 
의 라인에 뭔가를하려고 사용하는 경우

macOS, iOS, tvOS 및 watchOS에서 사용할 수 있습니다. Swift's preprocessor directives에 대한 자세한 정보

+0

스위프트는'TARGET_OS_IPHONE'과 같은 플래그를 사용하지 않습니다. 하지만 [대상 플랫폼 조건부] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8)가 있습니다. -ID31)와 같은 #if os (iOS). – rickster

+0

지적 해 주셔서 감사합니다! – fpg1503

관련 문제