gpt4 book ai didi

objective-c - 带返回值的宏

转载 作者:行者123 更新时间:2023-11-30 13:35:12 26 4
gpt4 key购买 nike

我正在尝试在 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)

有人知道解决这个问题的好方法吗?

编辑

我了解守卫,但使用守卫,每次我必须重写子类中的方法时,我都必须重写大量代码

/**
* mustOverride
*/
#define mustOverride \
{ NSLog(@"You must override this function") }

#define mustOverrideFailedReturn(ret) \
{ mustOverride \
return ret; }

编辑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 }

最佳答案

Swift 没有这种宏功能。

就实现你的目标而言。使用 guard 语句可以最正确地处理您所遵循的模式。包含保护语句的函数必须退出封闭范围(或陷阱),并且可以通过返回来执行此操作。

请查看 Swift 文档以获取有关控制流和提前退出控制的信息

关于objective-c - 带返回值的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36160753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com