我知道在Swift中所有变量都必须设置一个值,并且通过使用选项,我们可以设置一个nil最初设置的变量.
我不明白的是,用a设置一个变量!是做什么的,因为我认为这会从一个可选项中"解开"一个值.我想通过这样做,你保证有一个值来展开该变量,这就是为什么在IBActions上你会看到它被使用.
所以简单地说,当你做这样的事情时,初始化的变量是什么:
var aShape : CAShapeLayer!
Run Code Online (Sandbox Code Playgroud)
为什么/我什么时候会这样做?
在Swift中声明属性有三种方法:
var optStr: String?
var normStr: String = "normStr"
var exactStr: String!
Run Code Online (Sandbox Code Playgroud)
第一个是具有optional类型的属性,在我们的例子中可以包含nil或String的类型.第二个是始终包含String 的属性.它应该在init或声明中初始化.
但第三种方式呢?
var exactStr: String!
Run Code Online (Sandbox Code Playgroud)
我在操场上做了一些实验,事实证明,需要一个功能,type?可以采取两种type,type?和type!变量作为参数:
var optStr: String?
var normStr: String
var forcedStr: String!
func printStr(str: String?) {
println("str: \(str)")
}
printStr(optStr) //prints: "str: nil"
//printStr(normStr) //doesn't compile as not initialized
printStr(forcedStr) //prints: "str: nil"
optStr = "optStr"; normStr = "normStr"; forcedStr = "forcedStr"
printStr(optStr) //prints "str: optStr"
printStr(normStr) //prints "str: normStr"
printStr(forcedStr) //prints …Run Code Online (Sandbox Code Playgroud) 在Swift函数签名中,!后面的参数意味着什么?更具体地说,它是否意味着参数需要在传入之前解包,或者在传入时自动解包(这是自动).这是一个示例:
func annotationButtonTUI(sender: UIButton!) { }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该函数是UIButton的目标,因此无论发生什么事情!都会自动发生.
我的想法是它意味着你可以期待一个未包装的sender物体,所以你不需要尝试打开它.
我该如何避免使用!使用此功能解压缩操作通常是一个不好的选择.
使用它的代码有什么更好的选择,使用它使代码看起来更简单,因为if检查变量!被召唤永远不会是零,所以不能崩溃.
我的导师向我们介绍了bang(!)操作员,然后告诉我们再也不要使用它了.告诉我们为什么当然,如果可选项为零,它将使我们的应用程序崩溃.
然而,我发现自己处于这样的情况下,爆炸操作员似乎是最简洁和安全的选择.
func fullName() -> String {
if middleName == nil {
return "\(firstName) \(lastName)"
}else{
return "\(firstName) \(middleName!) \(lastName)"
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做这样的事情?
此外,如果有人想知道,这是完整的课程.
class CPerson{
var firstName: String
var middleName: String?
var lastName: String
init(firstName: String, middleName: String?, lastName: String) {
self.firstName = firstName
self.middleName = middleName
self.lastName = lastName
}
convenience init(firstName: String, lastName: String) {
self.init(firstName: firstName, middleName: nil, lastName: lastName)
}
func fullName() -> String {
if middleName == nil {
return "\(firstName) \(lastName)" …Run Code Online (Sandbox Code Playgroud) 每:
@IBOutlet weak var nameLabel: UILabel!
Run Code Online (Sandbox Code Playgroud)
每当我声明我的IBOutlets时,我只使用var而不是weak var.但我最近遇到了一些使用弱var的代码模板.他们为什么这样做?还有什么好处?
为什么在UILabel结束时会有一个爆炸操作员.我知道这是必需的,我和它一起去,但现在就问它.
提前致谢.
我想知道如何实现Swift(Int,Float ...)中的值类型来支持可选绑定("?").我假设这些值类型没有在堆上分配,而是在堆栈上分配.那么,它们是否依赖某种指向可能为null的堆栈的指针,或者底层struct是否包含布尔标志?
在Swift中,我们操作的元素都有类型.
当我们使用这些类型时,我们可以添加一个' !',' ?'或者没有表达他们的可空性.
一个类型的装饰者?装饰师?接线员?别的什么?
这是一种新型吗?它是装饰类型吗?一种类型的变化?
swift编译器似乎将它们视为新类型,但我的问题不是实现或语言相关,因此我将其标记为语言不可知.
编辑:我正在寻找一个与语言无关的名字.我理解pranjalsatija的评论选项被定义为compound type.但是,这是一个语言实现细节.我可以将我的问题改为:
当使用类型定义时,您将具有特殊含义的字符称为什么,以及如何调用派生类型.
这个术语应该适用于红宝石中的资本套管常数,因为概念是相似的.
任何人都可以详细解释之间的技术差异!&?我们在快速语言中使用的文字.基本上在苹果开发者文档中,他们将其称为零验证,但我并不清楚它背后的逻辑.你能用一些实时逻辑解释一下吗?
在此先感谢用户.
我一直试图理解选项的概念并隐式解包可选但我只是没有得到术语?我的问题是:
解包只是揭示变量的真值,无论它是零还是值?