Я пытаюсь воспроизвести эту картину в Swiftмакрокоманды с возвращаемым значением
#define mustBeKindOfClassFailedReturn(object, objectClass, ret) \
if(![object isKindOfClass:objectClass]) { \
NSLog(([NSString stringWithFormat:@"%@ must be kind of %@ class, current class is %@", object, NSStringFromClass(objectClass), NSStringFromClass([object class])])) \
return ret; }
используется как это
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
insetForSectionAtIndex:(NSInteger)section {
mustNotBeNilFailedReturn(self.adapter, UIEdgeInsetsZero)
mustBeKindOfClassFailedReturn(self.adapter, [WBCollectionViewSectionAdapter class], UIEdgeInsetsZero)
Кто-нибудь знает хорошее решение этой проблемы?
Редактировать
Я знаю про охранника, но с помощью охранника я должен переписать много кода каждый раз, когда я буду иметь, чтобы переопределить метод в моих подклассов для Exemple
/**
* mustOverride
*/
#define mustOverride \
{ NSLog(@"You must override this function") }
#define mustOverrideFailedReturn(ret) \
{ mustOverride \
return ret; }
EDIT 2
Я закончил с решением, является ли это оптимальным?
func needOverride(function: String = __FUNCTION__, file: String = __FILE__, line: Int = __LINE__) -> Bool {
REVLogManager.SharedInstance.logErrorMessage("You must override this function", function: function, file: file, line: line, exception: nil, error: nil)
return false
}
func doesObject(function: String = __FUNCTION__, file: String = __FILE__, line: Int = __LINE__, matchingObject: AnyObject!, matchesClass matchingClass: AnyClass) -> Bool {
guard matchingObject.isKindOfClass(matchingClass) else {
let message = "\(matchingObject) must be kind of \(matchingClass) class, current class is \(matchingObject.dynamicType)"
REVLogManager.SharedInstance.logErrorMessage(message, function: function, file: file, line: line, exception: nil, error: nil)
return false
}
return true
}
Я вызываю метод как этот
public func actualScrollOffsetDistanceWithScrollView(scrollView: UIScrollView!) -> Float {
guard needOverride() else { return 0.0 }
return 0.0
}
И
guard doesObject(matchingObject: self, matchesClass: REVListSectionAdapter.classForCoder()) else { return }
Что такое «ret» Предполагалось быть? – PeejWeej
Это может быть что угодно: Float, Int, AnyObject, Bool, UIEdgeInsets и даже nil – Pwyll28