this Objective-C açık kaynak projesini Swift'e dönüştürüyorum. Opsiyonel delegeler bir demet var.isteğe bağlı temsilci yöntemlerinde TOEelector'ı yanıtlıyor
@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;
Onları Swift'e dönüştürdüm. Objective-C projede
@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)
}
, bu isteğe yöntemleri çağırmadan önce, bu gibi
respondsToSelector
kullanarak kullanılabilirliğini denetler.
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;
doğrudan BEMAnalogClockDelegate
NSObjectProtocol
uydurmanın ve böylece gibi onları arayarak Swift bu dönüştürdü.
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
}
Ancak bu, proje çalıştırıldığında EXC_BREAKPOINT çökmesine neden olur.
Ben bir çözüm için googled ve bunun için guard let
kullanmanızı önerir this makaleye geldi.
Ancak sorunum, else
bölümündeki mantığı nasıl belirleyebilirim? Örneğin, yukarıdaki ilk if else
bloğunda, if
bloğundaki yöntemi kontrol eder ve eğer başarısız olursa,değerini else
bloğunda UIColor.whiteColor()
olarak ayarlar.
guard let
yaklaşımını kullanırsam bunu nasıl yaparım? Ya da genel olarak bunu yapmak için daha iyi bir yolu var mı?
Bu cevap yardımcı olabilir: http://stackoverflow.com/a/36475215/2976878 – Hamish