2016-04-07 15 views
0

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 BEMAnalogClockDelegateNSObjectProtocol 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ı?

+0

Bu cevap yardımcı olabilir: http://stackoverflow.com/a/36475215/2976878 – Hamish

cevap

2

Swift, isteğe bağlı yöntemleri de destekler.

Bunun yerine bunu yapabilirsiniz:

graduationColor = delegate.analogClock?(self, graduationColorForIndex: i) ?? UIColor.whiteColor()

Veya uzun bir yol:

if let graduationColor = delegate.analogClock?(self, graduationColorForIndex: i) { 
    self.graduationColor = graduationColor 
} else { 
    self.graduationColor = UIColor.whiteColor() 
}