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;
私は直接BEMAnalogClockDelegate
がNSObjectProtocol
に準拠して行うので、同じようにそれらを呼び出すことにより、スウィフトにこれを変換します。
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
アプローチを使用するとどうすればよいですか?あるいは、これを全体的に行うより良い方法がありますか?
をこの答えは役に立つかもしれません:あなたは代わりにこれを行うことができ
http://stackoverflow.com/a/36475215/2976878 – Hamish