gpt4 book ai didi

ios - 可选委托(delegate)方法上的 respondsToSelector

转载 作者:行者123 更新时间:2023-11-28 12:51:11 29 4
gpt4 key购买 nike

我正在转换 this Swift 的 Objective-C 开源项目。它有一堆可选的代表。

@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 崩溃。

我在谷歌上搜索了一个解决方案并找到了 this建议为此使用 guard let 的文章。

但是我的问题是如何指定 else 部分中的逻辑?例如,在上面的第一个 if else block 中,它检查 if block 中的方法,如果失败,则设置 graduationColor 的值到 else block 中的 UIColor.whiteColor()

如果我使用 guard let 方法,我该怎么做?或者是否有更好的方法来总体上做到这一点?

最佳答案

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

关于ios - 可选委托(delegate)方法上的 respondsToSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36478834/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com