gpt4 book ai didi

objective-c - 在 Swift 中用 return 模拟宏

转载 作者:可可西里 更新时间:2023-11-01 02:25:21 25 4
gpt4 key购买 nike

在 Obj-C 中,我可以定义一个宏

#define check_nil(x) if (!x) { return nil }

可用于测试函数是否返回了nil(表示错误),如果是这种情况,调用者可以简单地返回nil——传播堆栈中的错误。我正在写一个解析器,这种模式经常发生。例如

- (id)caller {
...
id z = [self callee];
check_nil(z);
...
}

- (id)callee {
...
}

不幸的是,在转向 swift 之后,宏就没有了。函数(使用 @autoclosure)将替换它们,但在本例中不是。现在我的代码中充斥着相同的 if 检查。

想在 Swift 中复制同样的东西吗?

最佳答案

您将无法准确实现该模式。

也许你可以使用一种类型,如果它们返回 nil,它将把 future 的操作变成空操作:

struct NonNil<T> {
var cantBeNil: T?

mutating func update(withClosure: () -> T?) {
if self.cantBeNil != nil {
self.cantBeNil = withClosure()
}
}
}

然后你可以像这样使用这个结构:

func myFunc() -> String? {
var nonNil = NonNil(cantBeNil: "")

nonNil.update {
// some action
return "new value"
}

nonNil.update {
// another action that ends up returning nil
return nil
}

// The rest of these don't end up calling the closure
nonNil.update {
println("not called")
return ""
}

nonNil.update {
println("not called")
return ""
}

return nonNil.cantBeNil
}

想法是,如果任何操作返回 nil,则其余代码将一直执行到 return 语句,而不执行任何其他操作。

这还将在视觉上将可能导致值设置为 nil 的所有代码部分分开

关于objective-c - 在 Swift 中用 return 模拟宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511177/

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