- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在转换 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/
当想要在委托(delegate)对象上调用协议(protocol)方法时,希望实现相应的协议(protocol)方法,我看到开发人员首先检查 if([delegate respondsToSelect
我试图实现 swift 的替代 respondsToSelector: 语法,该语法也显示在主题演讲中。 我有以下内容: protocol CustomItemTableViewCellDelegat
我目前正在使用 -respondsToSelector:,如下所示: if (![moviePlayer respondsToSelector:@selector(currentPlaybackTim
我正在编写自己的 gridview 实现(基于 tableview 模式)。我遵循了类似于 TableView 的数据源模型,但是当我检查数据源是否响应消息时,调用总是失败。 我已经尝试放置断点并在执
据我所知 respondsToSelector: 是 NSObject Protocol 的一个方法,但是对于协议(protocol)中的所有方法,符合该协议(protocol)的类需要提供实现,但我
在 UIViewController 的一个简单子(monad)类中,我只是实现了一个选择器作为刷新 UI 的回调 -(void)afterfollowAction:(id)object{ //b
假设我们有不同的对象,它们具有相同的方法名称但具有不同的参数类型,例如:getMethod:(NSNumber*)aNumber 和 getMethod:(NSString*)aString . 如何
如果我向 NSXML Parser 发送错误的 URL,我会尝试找出我的应用程序崩溃(RSS 阅读器)的原因。我有一个 EXC_BAD_ACCESS。因此,经过一番搜索后,我发现我必须使用 Zombi
是否有来自 Objective C 的 respondsToSelector: 方法的 Android 模拟? 最佳答案 在 Java 中,您通常期望在定义方法的地方有一些接口(interface)。
我正在按照苹果的示例代码来了解如何在 iOS 7 下实现收据验证,并且它有效,除非我在 iOS 6 下运行以下代码(基本上逐字地从他们的示例中获取) NSBundle *bundle =[NSBund
我用respondsToSelector检查的方法是否必须实际存在? 如果我只在接口(interface)部分定义而没有实现怎么办?我正在研究 Objective-C 中的穷人虚拟函数。 最佳答案 首
以下行编译正常但在 iOS 8 中错误地返回 false。为什么? [[NSLayoutConstraint class] respondsToSelector:@selector(setActive
如果类响应选择器,我正在寻找以动态方式检查的可能性。 例如,我在类中有一个严格的方法名称模式,如“parse[CountryCode]Adress”。 我尝试过这样的事情: SEL selector
我试图通过在 [UIBarButtonItem appearance] 上运行 respondsToSelector 来检测特定于 iOS 6 的外观方法。但是,无论我指定什么选择器,它总是为我返回
有没有等价于-respondsToSelector:的类方法? 类似于 +respondsToSelector:? 我问的原因是因为通过在类级别实现 -respondsToSelector:,我收到编
我已经实现了一个带有可选方法的协议(protocol),并且在我想发送的调用方法中 respondsToSelector:至self.delegate在我发送消息之前,但这不会编译。失败消息是: 选择
在内部,respondsToSelector 是否不仅仅是找出 class_getInstanceMethod 是否返回非零值? respondsToSelector 本质上是 class_getIn
在内部,respondsToSelector 是否不仅仅是找出 class_getInstanceMethod 是否返回非零值? respondsToSelector 本质上是 class_getIn
我正在转换 this Swift 的 Objective-C 开源项目。它有一堆可选的代表。 @protocol BEMAnalogClockDelegate @optional - (void)c
NSObject 的“响应”方法似乎在最新版本的 Xcode 9 Beta 4、Swift 4.0 版中被破坏。 下面是在 Xcode 8 上测试的示例代码(工作正常),在 Xcode 9 上,方法“
我是一名优秀的程序员,十分优秀!