2016-04-07 8 views
0

Ich konvertiere this Objective-C Open-Source-Projekt zu Swift. Es hat eine Reihe von optionalen Delegierten.Antworten auf optionale Delegate Methoden

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

Ich konvertierte sie zu Swift wie so.

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

Im Objective-C-Projekt, bevor diese optionalen Methoden aufrufen, überprüft er seine Verfügbarkeit respondsToSelector wie folgt aus.

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; 

I umgewandelt direkt dies zu Swift durch die BEMAnalogClockDelegate sie machen entsprechen wie so zu NSObjectProtocol und aufrufen.

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 
} 

Aber dies führt zu einem EXC_BREAKPOINT Absturz, wenn das Projekt ausgeführt wird.

Ich googelte für eine Lösung und stieß auf this Artikel, der guard let dafür empfiehlt.

Allerdings ist mein Problem, wie ich die Logik angeben, die in den else Teil geht? Zum Beispiel im ersten Block if else, der die Methode im Block if überprüft und falls er fehlschlägt, setzt er den Wert für graduationColor auf UIColor.whiteColor() im Block else.

Wie mache ich das, wenn ich den guard let Ansatz verwende? Oder gibt es einen besseren Weg, dies insgesamt zu tun?

+0

Diese Antwort könnte hilfreich sein: http://stackoverflow.com/a/36475215/2976878 – Hamish

Antwort

2

Swift unterstützt auch Optionen für Methoden.

Sie können dies tun, anstatt:

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

Oder den langen Weg:

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