首页 > 解决方案 > Swift 简短的执行语法

问题描述

我正在寻找编写简短语法的方法。

例如。在 JS、PHP 等中。

var a = 1 ;

function Foo ()-> void {}

a && Foo() ;

如果 a 存在,则运行 Foo。

a 和 Foo 本身已经意味着存在与否,语法看起来更好......

然而,在 Swift 中,打字检查有点困难。

var a = 1 ;

func Foo ()-> Foid {} ;

a && Foo();

不会产生 Bool 返回错误。

a != nil && Foo() ;

这可以解决和可变条件,但是如果更好地绕过功能条件怎么办?我只是不想写类似的东西

if( a != nil ) { Foo() } ;

然而,不存在更好的语法是什么?

if ( !a ) or !a //is easy and better looks...

我在swift中发现没有类似的东西......

if( a == nil ) // will throws error when its not Optional Typing.

guard var b = xxx else {} // simply for Exist and very long syntax.

感谢您的意见!

标签: swift

解决方案


您从 PHP 和 JS(以及 Ruby、Python 等)等动态语言开发的期望几乎普遍不适用于 Swift 等静态语言。

Swift 是一种静态编译语言。如果你引用了一个不存在的变量,那么它就不是合法的 Swift 代码,编译器会导致你的构建失败。鉴于此,“我如何检查变量是否未定义?”的问题。在 Swift 中完全没有实际意义。如果您有一个引用变量的成功编译程序a,则a存在。绝对没有理由进行检查,因此甚至不存在检查机制。

静态与动态类型

静态类型系统就像数学证明系统。它们会提供严格的证明,证明您的程序的某些方面是有效的。这需要权衡取舍。刚性为您带来许多保证。例如,你永远不会有一个有效的 Swift 程序,你不小心传递了Int一个Bool预期的地方。静态类型系统使此类错误实际上是不可能的,因此您不必记住自己检查。

另一方面,许多真理更容易直觉而不是证明。因此,脚本和动态语言非常有用,因为它们不需要静态语言所需的严格证明。不利的一面是,他们的类型系统“做”得少得多。例如,JS 很乐意让你引用一个未定义的变量。为了解决这个问题,JS 为您提供了一种方法来执行运行时检查以查看变量是否已定义。但这不是 Swift 的问题,因此没有“解决方案”。

当静态类型太难时

斯威夫特实际上采取了中间立场。如果您发现自己的陈述显然是正确的,但很难向编译器证明,则存在各种“逃生舱”,可以让您离开类型系统的安全性,进入动态领域。例如,如果您查看IBOutlet,并看到它连接到情节提要中的元素,您可以直观地确定IBOutlet不是nil。但这不是您可以向编译器证明的东西,因此当您看到隐式展开的可选项用于IBOutlets 时。

隐式展开的选项就是这样一种“逃生舱”。Any类型是另一种类型,如, unsafeBitcast(_:to:), withoutActuallyEscaping(_:),as!try!


推荐阅读