如何在Swift 5.0 / Xcode中用于强制解包

Tom*_*ulz 7 xcode ios swift

我希望能够代替使用!用于在Swift代码中强制展开。如果这是C ++,则可以尝试使用#define或类似的方法,但是我不确定如何实现。

我不能只在全球范围内替换!与,因为它不是用于声明强制解包变量,也可能是其他一些东西

使用某种Xcode宏或插件会更容易吗?

mat*_*att 8

不幸的是,您不能使用字符作为后缀运算符,例如!,但这是一种替代方法:

postfix operator ?
extension Optional {
    postfix public static func ?(a: Optional<Wrapped>) -> Wrapped {
        return a!
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

var crashme : String? // nil
print(crashme?) // crash
Run Code Online (Sandbox Code Playgroud)

我喜欢这个替代符号,因为它暗示着定时炸弹,这正是IUU。也许这意味着嘿醒!

  • @Cœur好吧,不。整个问题在于,大多数字符都不允许用作运算符(尤其是运算符_first_字符)。这就是https://gist.github.com/natecook1000/c5fb2b8cd0967f53770e的全部内容(更不用说官方文档了)。 (2认同)

Cod*_*der 5

正如注释和Matt的答案中所讨论的那样,该字符不能用作运算符,因此,如果您特别想使用它,则可以使用此处所示的扩展名来使用它。

extension Optional {
    var : Wrapped {
        return self!
    }
}

var string: String? = "42"
print(string.) // 42

var number: Int? = nil
print(number.) // Fatal error: Unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

此扩展使用Optional类型,因此可以与符合Optional的任何数据类型一起使用。

但是,如果要使用后缀路由,则以下选项提供了一个选项:

postfix operator ?
extension Optional {
    postfix static func ?(optional: Optional<Wrapped>) -> Wrapped {
        return optional!
    }
}

var bad: String?
print(bad?)
Run Code Online (Sandbox Code Playgroud)

可悲的是,骷髅和交叉骨在这里的显示不如在Xcode中那样。

在此处输入图片说明

关于OP的重要说明,如果您希望在团队中强制使用此功能,我建议使用swiftlint之类的工具,您可以在其中修改有关强制展开的规则,以要求其中一些。

  • @matt这是所有允许的运算符的方便列表:https://gist.github.com/natecook1000/c5fb2b8cd0967f53770e对于这种情况,最合适的选择是IMO (3认同)
  • 什么?太离谱了! (2认同)