- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
编辑:这个问题的目的是理解隐式可选运算符“!”的使用。在早期的 UIKit API 更新中,特别是如果一个函数被声明为返回一个预期为非可选的类型,为什么要使用可选的,如果它是可选的,为什么不使用可选的“?”运算符(operator)。 “!”的语义虽然总是很清楚。
随着时间的推移,Apple 审核了 API 以使可选性更加精确,使用 ?对于真正的可选类型,并在它们实际上是非可选类型时使用非可选类型。这是对通常含糊不清的原始 Objective-C 签名的保留。
swift 文档解释了 !可选类型的拆箱运算符,
var optionalString : String? = "optional"
var regularString: String = optionalString!
但他们自己在类型定义(字符串!)上使用了它,但我没有找到明确的解释。
例子:
func takesBang(value:String!) -> String {
if !value {
return "nil value, without the safe syntax"
}
return "This works"
}
var unsafe:String!
takesBang(unsafe) // yields "nil value, without the safe syntax"
字符串! type 不会强制取消装箱可选类型,但似乎只是消除了对可选语法 (?.) 的需要。 Apple 在他们自己的示例中使用了它,但它似乎只否定了可选的安全(指针)机制。
谁能解释一下目的/动机?这似乎通常不安全,因为调用者不必检查或至少考虑它们的值。
最佳答案
语言引用指出,?
还有!
, 当用于 var
时声明只是语法糖(意味着它们在解析期间被编译器替换)。它们映射到 Optional<T>
(?) 和 ImplicitlyUnwrappedOptional<T>
(!) 分别。
虽然您必须使用 if let maybeNil = someVar? { ... }
Optional<T>
类型变量的语法,您不必对隐式解包的可选值这样做(顾名思义)。作为https://stackoverflow.com/a/24071003/1599345中的海报已经提到,隐式展开的可选值旨在与旧版 Objective-C API 一起使用,因为它们没有为 Swift 提供足够的信息。
所以作为一个简短的回顾:
var foo : SomeType? // should be read as var foo : Optional<SomeType>
var bar : SomeType! // should be read as var bar : ImplicitlyUnwrappedOptional<SomeType>
?
的用法和 !
当使用变量中的实际值时,实际上是一个可以用这种方式读取的映射,类似于上面的声明:
foo?.somemethod() // if let maybeFoo = foo { maybeFoo.somemethod() }
foo!.somemethod() /* # Yeah I know for sure, that this is NOT nil ever ever… just call `somemethod` and kill me at runtime if it doesn't work out.
关于ios - swift:强制类型修饰符 "!"- 为什么它在 UIKit API 中使用(现在不合时宜),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070919/
SQL FMDB 的修饰符在哪里描述?特别是,如何在要插入的字符串中放置引号。比如我想将名称“Mac's Place”插入数据库?谢谢 最佳答案 如果在 SQL 中使用 executeUpdate 和
我读过 article在 MSDN 上。它解释了为什么“in”应该只与自定义只读结构一起使用,否则会有性能损失。但是,我不太明白如何对原始类型使用“in”。由于 C# 中的所有内置值类型都是不可变的,
“__printflike__ 修饰符”到底是什么?这个词是什么意思? 最佳答案 据推测,它会告诉编译器您正在使用的函数接受格式为 [anything, ] format, ... 的参数,其中 fo
我在 VS2010 上使用 ReSharper 插件,我正在生成一个接口(interface)方法。ReSharper 在参数名称上放置一个 @。那是做什么用的? int Count(Func @wh
我在写小偷中用了大量的正则,所以在接下来的版本中要逐步减少正则的应用 在PHP正则表达式中需要转义的字符如下: $^*()+={}[]|/:<>.?'" 注意:perl风
http://msdn.microsoft.com/en-us/library/435f1dw2.aspx public class Base { public string Field; }
根据scala-wartremover静态分析工具我必须将“final”放在我创建的每个案例类前面:错误消息显示“案例类必须是最终的”。 根据scapegoat (Scala 的另一个静态分析工具)相
在 tcsh 中,我可以通过以下方式从路径末尾提取第二个路径元素 cd /some/long/directory/structure/path/ set x=`pwd` echo ${x:h:h:t}
我找到了很多 SwiftUI 教程,其中修饰符 .resizable() 用于图像。它似乎不再适用于带有 Swift 5 的 Xcode 13.3.1。 导入了 SwiftUI。如果您自己键入整个修饰
我已经设置好了音频播放器 除了步进器的当前功能外,我还想为 onIncrement 和 onDecrement 播放单独的声音。 这个项目使用核心数据来持久化。 $estimatorData.qty
来自 linux 内核脚本/mod/modpost.c: static int is_vmlinux(const char *modname) { const char *myname;
我刚刚遇到了一个BNF Grammar for JAVA 。其中,“修饰符”有一个称为“threadsafe”的终结符号。但是,我以前从未见过它,也无法在《Java 语言规范》Java SE 7 版
我创建了一个脚本,它将我组中的所有帖子嵌入到我的网站上。为此,我必须知道所有可能的修饰符“附件”类型。 现在我知道,那个类型可以是: 分享, video_share_youtube。 但我不知道在哪里
在 tcsh 中,我可以通过以下方式从路径末尾提取第二个路径元素 cd /some/long/directory/structure/path/ set x=`pwd` echo ${x:h:h:t}
我找到了很多 SwiftUI 教程,其中修饰符 .resizable() 用于图像。它似乎不再适用于带有 Swift 5 的 Xcode 13.3.1。 导入了 SwiftUI。如果您自己键入整个修饰
我正在编写一个代表一些简单几何形状的 Java 类。 最上面abstract类(它本身是包私有(private))我已经声明了需要从同一包中的子类访问的属性。 如果我将属性声明为 final在 Abs
我已经设置好了音频播放器 除了步进器的当前功能外,我还想为 onIncrement 和 onDecrement 播放单独的声音。 这个项目使用核心数据来持久化。 $estimatorData.qty
明确地说,我是 不是 询问如何使用 ViewModifier 协议(protocol)来创建一个带有 body 函数的结构,然后可以使用它来修改 View 。这个问题有点不同。 我正在尝试创建 Nav
我有一个内部类,用于存储我用于游戏的控件的信息,现在我想在其中存储一个静态 ArrayList,其中包含所有控件的名称。但我收到此错误:“修饰符 static 只允许在常量变量声明中” private
public class This_testing { int x,y; public This_testing(int x,int y){ //Why modifier void
我是一名优秀的程序员,十分优秀!