swift - 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.
感谢您的意见!
解决方案
您从 PHP 和 JS(以及 Ruby、Python 等)等动态语言开发的期望几乎普遍不适用于 Swift 等静态语言。
Swift 是一种静态编译语言。如果你引用了一个不存在的变量,那么它就不是合法的 Swift 代码,编译器会导致你的构建失败。鉴于此,“我如何检查变量是否未定义?”的问题。在 Swift 中完全没有实际意义。如果您有一个引用变量的成功编译程序a
,则a
存在。绝对没有理由进行检查,因此甚至不存在检查机制。
静态与动态类型
静态类型系统就像数学证明系统。它们会提供严格的证明,证明您的程序的某些方面是有效的。这需要权衡取舍。刚性为您带来许多保证。例如,你永远不会有一个有效的 Swift 程序,你不小心传递了Int
一个Bool
预期的地方。静态类型系统使此类错误实际上是不可能的,因此您不必记住自己检查。
另一方面,许多真理更容易直觉而不是证明。因此,脚本和动态语言非常有用,因为它们不需要静态语言所需的严格证明。不利的一面是,他们的类型系统“做”得少得多。例如,JS 很乐意让你引用一个未定义的变量。为了解决这个问题,JS 为您提供了一种方法来执行运行时检查以查看变量是否已定义。但这不是 Swift 的问题,因此没有“解决方案”。
当静态类型太难时
斯威夫特实际上采取了中间立场。如果您发现自己的陈述显然是正确的,但很难向编译器证明,则存在各种“逃生舱”,可以让您离开类型系统的安全性,进入动态领域。例如,如果您查看IBOutlet
,并看到它连接到情节提要中的元素,您可以直观地确定IBOutlet
不是nil
。但这不是您可以向编译器证明的东西,因此当您看到隐式展开的可选项用于IBOutlet
s 时。
隐式展开的选项就是这样一种“逃生舱”。Any
类型是另一种类型,如, unsafeBitcast(_:to:)
, withoutActuallyEscaping(_:)
,as!
等try!
。
推荐阅读
- android - Order App - Android 将值数组发布到数据库
- asynchronous - Flutter:对话框在加载数据之前弹出
- arrays - 如何使用组合框的第一个存储值作为默认值EXTJS
- symfony - Symfony4 映射问题
- javascript - “window.location.href”在新选项卡中打开链接
- javascript - 如何在单击时将类添加到 div,并通过单击页面上的其他位置来删除类
- css - 如何使具有 Ken Burns 效果的图像保持更大尺寸?
- botframework - Azure 搜索资源管理器和 Bot 结果的搜索分数不匹配
- junit - 如何处理依赖的集成测试类?
- python - 在类本身内部调用类方法