gpt4 book ai didi

swift - 是否可以在 Swift 中禁用某些代码行?

转载 作者:搜寻专家 更新时间:2023-10-31 22:35:02 24 4
gpt4 key购买 nike

我试图通过使用宏使我的代码可以同时使用 Swift 1.2 和 2.0 进行编译,而无需创建新分支。

您在自定义 Swift 编译器标志中定义的 Swift 中的宏不允许您像 Obj-C 一样自由地检查条件。

例如,在函数声明中,如果它像 Obj-C。我可以做这样的事情。

class ThisIsAClass
{
#if SWIFT_TWO_POINT_O
func foo(bar bar: String)
#else
func foo(#bar: String)
#endif
{
// Do some common code
// ...
// ...

#if SWIFT_TWO_POINT_O
print("Do 2.0 things")
#else
print("Do 1.2 things")
#endif
}
}

函数内的宏条件检查没问题。但是声明函数的条件检查会失败。

有什么方法可以实现这样的目标。

或者将 Swift 1.2 和 2.0 分支分开是唯一的方法。

最佳答案

是的,您可以定义编译器标志并检查它们以有条件地编译部分源代码,as noted in the docs .

但是,有一个重要的警告(强调):

In contrast with condition compilation statements in the C preprocessor, conditional compilation statements in Swift must completely surround blocks of code that are self-contained and syntactically valid. This is because all Swift code is syntax checked, even when it is not compiled.

所以你不能这样做:

#if SWIFT_ONE
func foo(/* swift 1 params */)
#else
func foo(/* swift 2 params */)
#endif
{
// ... function body ...
}

...因为 func foo(params) 不是语法上完整的元素。 (语法上完整的函数声明包括函数体。)同上,例如,尝试 #if 围绕类声明而不是其内容等。

那么你可以做什么呢?

  • 在这种特殊情况下,func foo(bar bar: String) 是完全有效的 Swift 1.x 语法。 # 只是它的简写...所以只需使用普通写法,您就不必担心语言版本差异。 (不过,请随时在 Twitter 上发布有关#foo 和#bar 的信息。)

  • 更一般地说,您可以拥有多个独立的函数并分派(dispatch)给它们:

    func foo() {
    #if SWIFT_ONE
    fooForSwift1()
    #else
    fooForSwift2()
    #endif
    }
  • 或者对于类或其他类型,您可以使用类型别名:

    class Foo1 { /* ... */ }
    class Foo2 { /* ... */ }
    #if SWIFT_ONE
    typealias Foo = Foo1
    #else
    typealias Foo = Foo2
    #endif

关于swift - 是否可以在 Swift 中禁用某些代码行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31241723/

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