我在学习iOS 8/OSX 10.10的Swift时遵循了this tutorial,术语"unwrapped value"被多次使用,如本段所述(在Objects and Class下):

使用可选值时,您可以写?手术前 如方法、属性和下标.如果值在?之前? 是零,之后的一切都是零吗?被忽略,而整体的价值 表达式为空.否则,为the optional value is unwrapped,并且 之后的一切?在unwrapped value号公路上行动.在这两种情况下, 整个表达式的值是可选值.

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare?.sideLength

我不明白,我在网上搜索没有运气.

这是什么意思?


编辑

从Cezary的回答来看,原始代码的输出和最终解决方案(在操场上测试)之间有一点差异:

原始代码

原始代码

塞扎里溶液

塞扎里溶液

在第二种情况下,超类的属性显示在输出中,而在第一种情况下,有一个空对象.

在这两种情况下,结果不是应该是相同的吗?

Related Q&A : 100

推荐答案

首先,您必须了解什么是可选类型.可选类型基本上意味着变量can be nil.

例子:

var canBeNil : Int? = 4
canBeNil = nil

问号表示canBeNil可以是nil.

这是行不通的:

var cantBeNil : Int = 4
cantBeNil = nil // can't do this

如果变量是可选的,要从中获取值,必须输入unwrap it.这只意味着在结尾加一个感叹号.

var canBeNil : Int? = 4
println(canBeNil!)

您的代码应该如下所示:

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare!.sideLength

附注:

您还可以通过使用感叹号而不是问号来声明要自动展开的可选选项.

例子:

var canBeNil : Int! = 4
print(canBeNil) // no unwrapping needed

因此,修复代码的另一种方法是:

let optionalSquare: Square! = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare.sideLength

编辑:

您看到的不同之处恰恰是可选值为wrapped这一事实的症状.在它的上面还有另一层.unwrapped版本只显示直形对象,因为它是展开的.

快速比较一下操场上的情况:

playground

在第一种和第二种情况下,对象不会自动展开,因此您会看到两个"层"({{...}}),而在第三种情况下,您只会看到一层({...}),因为对象会自动展开.

第一种情况和第二种情况之间的区别在于,如果将optionalSquare设置为nil,第二种情况将给您一个运行时错误.使用第一种情况下的语法,可以执行以下操作:

if let sideLength = optionalSquare?.sideLength {
    println("sideLength is not nil")
} else {
    println("sidelength is nil")
}

Ios相关问答推荐

如何在iPhone 15上消除.NET Maui中状态栏和页面之间的差距

将数据传回VC时委托为空

XcodeCloud生成失败,返回";ci_pre_xcodeBuild.sh是可执行文件,但退出时返回2个退出代码.";

GraphQL iOS Apollo客户端自动持久化查询导致崩溃

无法使用 NavigationView 和 NavigationLink 在 SwiftUI 中弹出当前屏幕

NSError 错误领域: "CBATTErrorDomain" 代码: 128 0x0000000282b111a0

在 iOS 上启用明文本地流量在 .NET MAUI 中不起作用

iOS - 判断开发者模式是否开启 (Swift)

expo EAS build (iOS) 在 Pod 安装步骤中失败 (SDK45 & 46)

SwiftUI 我自己的渲染函数的返回类型是什么?

将值传递给导航链接视图中的文本框

向左或向右移动时如何水平翻转sprite?

NSFetchedResultsController 由字符串的第一个字母创建的部分

Xcode intellisense 彩色框中字母的含义,如 f、T、C、M、P、C、K、# 等

如何在 SwiftUI 中检测 TextField 的实时变化?

在 Swift 中追加字符串

从 NSUserDefaults 字典 iOS 中删除所有键

如何找出用于构建 *.ipa 文件的配置文件?

如何为 NSDate 添加一个月?

值/对象的 NSDictionary 键?