0

このObjective-C オープン ソース プロジェクトを Swift に変換しています。オプションのデリゲートがたくさんあります。

@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;

このようにSwiftに変換しました。

@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)
}

Objective-C プロジェクトでは、これらのオプション メソッドを呼び出す前に、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そのように呼び出すことで、これを直接 Swift に変換しました。

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ました。

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

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

4

1 に答える 1