2016-04-07 19 views
0

this Objective-CオープンソースプロジェクトをSwiftに変換しています。これは、オプションの代議員の束を持っています。respondsToSelector(任意のデリゲートメソッド)

@protocol BEMAnalogClockDelegate <NSObject> 

@optional 

- (void)currentTimeOnClock:(BEMAnalogClockView *)clock Hours:(NSString *)hours Minutes:(NSString *)minutes Seconds:(NSString *)seconds; 
- (NSString *)dateFormatterForClock:(BEMAnalogClockView *)clock; 
- (NSString *)timeForClock:(BEMAnalogClockView *)clock; 
- (UIColor *)analogClock:(BEMAnalogClockView *)clock graduationColorForIndex:(NSInteger)index; 
- (CGFloat)analogClock:(BEMAnalogClockView *)clock graduationAlphaForIndex:(NSInteger)index; 
- (CGFloat)analogClock:(BEMAnalogClockView *)clock graduationWidthForIndex:(NSInteger)index; 
- (CGFloat)analogClock:(BEMAnalogClockView *)clock graduationLengthForIndex:(NSInteger)index; 
- (CGFloat)analogClock:(BEMAnalogClockView *)clock graduationOffsetForIndex:(NSInteger)index; 

私はそれらをスウィフトに変換しました。 Objective-Cのプロジェクトで

@objc protocol BEMAnalogClockDelegate { 
    optional func currentTimeOnClock(clock: BEMAnalogClockView, hours: String, minutes: String, seconds: String) 
    optional func dateFormatterForClock(clock: BEMAnalogClockView) -> String 
    optional func timeForClock(clock: BEMAnalogClockView) -> String 
    optional func analogClock(clock: BEMAnalogClockView, graduationColorForIndex index: Int) -> UIColor 
    optional func analogClock(clock: BEMAnalogClockView, graduationAlphaForIndex index: Int) -> CGFloat 
    optional func analogClock(clock: BEMAnalogClockView, graduationWidthForIndex index: Int) -> CGFloat 
    optional func analogClock(clock: BEMAnalogClockView, graduationLengthForIndex index: Int) -> CGFloat 
    optional func analogClock(clock: BEMAnalogClockView, graduationOffsetForIndex index: Int) -> CGFloat 
    optional func clockDidBeginLoading(clock: BEMAnalogClockView) 
    optional func clockDidFinishLoading(clock: BEMAnalogClockView) 
} 

、これらの任意のメソッドを呼び出す前に、それはこのようなrespondsToSelectorを使用して、その可用性をチェックします。

if ([self.delegate respondsToSelector:@selector(analogClock:graduationColorForIndex:)]) { 
    self.graduationColor = [self.delegate analogClock:self graduationColorForIndex:i]; 
} else self.graduationColor = [UIColor whiteColor]; 

if ([self.delegate respondsToSelector:@selector(analogClock:graduationAlphaForIndex:)]) { 
    self.graduationAlpha = [self.delegate analogClock:self graduationAlphaForIndex:i]; 
} else self.graduationAlpha = 1.0; 

私は直接BEMAnalogClockDelegateNSObjectProtocolに準拠して行うので、同じようにそれらを呼び出すことにより、スウィフトにこれを変換します。

if delegate.respondsToSelector(#selector(BEMAnalogClockDelegate.analogClock(_:graduationColorForIndex:))) { 
    graduationColor = delegate.analogClock!(self, graduationColorForIndex: i) 
} else { 
    graduationColor = UIColor.whiteColor() 
} 

if delegate.respondsToSelector(#selector(BEMAnalogClockDelegate.analogClock(_:graduationAlphaForIndex:))) { 
    graduationAlpha = delegate.analogClock!(self, graduationAlphaForIndex: i) 
} else { 
    graduationAlpha = 1 
} 

は、しかし、これは、プロジェクトが実行されEXC_BREAKPOINTのクラッシュの原因となります。

私は解決策を探して、これにguard letを使用することを推奨しているthisの記事に出会いました。

しかし、私の問題は、elseの部分に入るロジックをどのように指定するのですか?たとえば、上記の最初のif elseブロックでは、ifブロックのメソッドをチェックし、失敗した場合は、elseブロックのgraduationColorの値をUIColor.whiteColor()に設定します。

guard letアプローチを使用するとどうすればよいですか?あるいは、これを全体的に行うより良い方法がありますか?

+0

をこの答えは役に立つかもしれません:あなたは代わりにこれを行うことができ

http://stackoverflow.com/a/36475215/2976878 – Hamish

答えて

2

Swiftはメソッドのオプションもサポートしています。

graduationColor = delegate.analogClock?(self, graduationColorForIndex: i) ?? UIColor.whiteColor()

それとも長い道のり:

if let graduationColor = delegate.analogClock?(self, graduationColorForIndex: i) { 
    self.graduationColor = graduationColor 
} else { 
    self.graduationColor = UIColor.whiteColor() 
}