在 Swift 的条件语句中将可选值分配给新变量的原因

2023-11-26

我正在浏览 swift 文档,在可选部分中,它讨论了使用问号 -?-- 表示可能为零的变量。这可以在 if 语句中使用来检查 nil,但在文档中,他们将可选值分配给条件中的新变量。是否有一个原因?

例如,它出现在the docs与此类似:

// Declare an optional string (might be nil)
var optionalString: String? = "Hello"

// Assigns optionalString to new variable before checking if nil
if let string = optionalString {
    println("\(optionalString) is not nil!")
}
else {
    println("\(optionalString) is nil")
}

然而,这在测试中对我来说运行得很好:

var optionalString: String? = "Hello"

// Assigns optionalString to new variable before checking if nil
if optionalString {
    println("\(optionalString) is not nil!")
}
else {
    println("\(optionalString) is nil")
}

问题

是否有分配的理由optionalString到一个新变量string在条件语句中?


看一下有关的部分可选链接在文档中。在您引用的示例中,没有太大区别。但在其他情况下,if-let构造可以让您获得来自一系列可选引用和方法调用的展开值,而无需使用隐式展开,如果您没有考虑链中值的所有可能绑定,隐式展开可能会使您的应用程序崩溃。

如果您想避免重新计算值,它也很有用。您可以通过许多与在 (Obj)C 中的条件中使用赋值相同的方式使用它(记住if (self = [super init])).

例如,如果正在测试的选项来自计算属性:

var optionalName: String? {
get {
    if checkTouchID() {
        return "John Appleseed"
    } else {
        return nil
    }
}
}
var greeting = "Hello!"
if optionalName != nil {
    greeting = "Hello, \(optionalName)"
}

将其粘贴到游乐场中,以及存根实现checkTouchID()返回true,您将立即在结果区域中看到optionalNamegetter 执行了两次。 (在更现实的场景中这将是一个问题,因为您可能不希望这样的代码隐式地checkTouchID() or downloadFromServer() or billApplePay()两次。)如果您使用if-let相反,您只需执行 getter 一次。

在一系列链式选项中(例如if let johnsStreet = john.residence?.address?.street在上面链接的文档中),您不想在主体中重写整个链if声明,更不用说重新计算它了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 的条件语句中将可选值分配给新变量的原因 的相关文章

随机推荐

  • 如何超过方法代码的 65535 字节限制

    我有一个产品列表 但 Java 抱怨该方法超出了 65535 字节的限制 如何添加更多字数并克服限制 public class ProductList extends Activity List view private ListView
  • 在 Java 中调整大小时绘制的内容不可见

    请注意 我没有在 Windows 机器上测试过这个 只在 Mac 机器上测试过 我不太确定这是否也会发生在 Windows 机器上 当我调整 Java 应用程序的大小时 内容是不可见的 我已经找到解决方法了after调整大小 但没有whil
  • 使用 webpack 时 Node 找不到模块“fs”

    我正在使用 node js 和 webpack 创建捆绑包 据我所知 node js 应该包含fs用于管理文件的模块 然而当我打电话时require fs 我得到一个Cannot find module fs 错误 我应该怎么办 我自己在与
  • 绑定时出现方法或操作未实现错误

    我目前正在开发一个 Visual Studio 插件 VSPackage 它最终应该能够可视化调用关系 为了代表他们我想用图 库它管理图形 避免重叠边缘等 不幸的是 我在运行时在 XAML 中收到以下错误消息 XamlParseExcept
  • 必需:找到的变量:值

    public static int biggestArrayGap int a int n int biggestGap Math abs a 1 a 0 for int i 1 i
  • gradle 中的版本范围

    在 gradle 依赖项中指定版本范围的可能方法有哪些 我看到了一些 1 符号 但我还没有找到真正说明什么是可能的 什么是不可能的文档 此外 我不知道 Maven 范围是否也可以使用 有人可以给我一个简短的概述 以便我能够理解规则吗 Gra
  • 从 Google Photos 应用程序获取 Uri 的路径

    我有一个应用程序 允许使用外部应用程序选择照片 然后我从 uri 获取照片的路径并将其用于内部操作 当用户使用 Google Photo 选择一张照片时 如果该图片存储在本地 则下一个代码可以完美运行 但如果图片在云端 结果是光标 getS
  • 带有圆形内边缘的方形布局边框

    我正在尝试创建一个布局边框 其角部外侧为方形 内侧为圆形 我发现我需要创建一个由两种形状组成的 xml 可绘制定义 一种具有笔划宽度和角半径 另一种仅具有笔划宽度 绘图 round border xml
  • 有没有办法在 Matplotlib 图的 x 轴上显示波斯日期

    我想绘制一个dataframe其中index由组成datetime价值观基于伊朗日历 我想设置x axis标签如下 import matplotlib dates as mdates axes scatter df day index va
  • NSTimer 在滚动期间停止

    在调试我的IOS项目开发于XCode4 我初始化并运行NSTimer目的 但是 一旦我按下滚动视图 计时器就会停止 并且在我释放滚动后它会继续运行 NSTimer 是否有配置使得计时器在滚动期间不会被阻塞 提前致谢 请添加这一行并重试 NS
  • Java 中字节转换为 int

    我需要在Java代码中将2个字节 2的补码 转换为int 我该怎么做 toInt byte hb byte lb return int hb lt lt 8 int lb 0xFF 所有情况下的正确操作留给学生作为练习
  • 将 State 属性添加到 React 中的内联样式

    我有一个具有如下内联样式的反应元素 缩短版本 div div 我想用我所在州的属性替换宽度 尽管我不太确定该怎么做 I tried div div 这可能吗 你可以这样做 style width this st
  • Android - 在LinearLayout和RelativeLayout中对视图顶部边距/底部边距/等进行动画处理

    我正在尝试创建一个从底部向上滑动的菜单 首先 菜单视图仅在屏幕底部可见 然后单击它会使其向上滑动 我尝试使用TranslateAnimation 但是虽然像素发生了移动 但菜单的点击区域仍处于与之前相同的位置 所以我认为如果我可以在动画完成
  • 保留数据迭代器的向量

    我有一个功能 void get good items const std vector
  • Spring SecurityContext 在错误页面上返回 null 身份验证

    我正在尝试为 403 访问被拒绝 和 500 内部服务器错误 等错误编写自定义错误页面 它们将从 Velocity 模板呈现 并使用用户的区域设置翻译所有消息 身份验证和区域设置解析在应用程序中运行良好 我在 web xml 中将位置设置为
  • Python 链式属性访问中的无传播[重复]

    这个问题在这里已经有答案了 有没有空传播算子 空感知成员访问 运算符 在Python中 所以我可以写类似的东西 var object children grandchildren property 如 C VB NET 和 TypeScri
  • 为什么 ClassInitialize 修饰方法会使我的所有测试失败?

    我从MSDN了解到 ClassInitialize是标记一个方法 该方法将在所有测试运行之前为所有测试执行一次设置代码 当我在下面的简化装置中包含这样的方法时 所有测试都会失败 我一注释掉 他们又通过了 TestClass public c
  • 获取 SortedList 中 2 个键之间的所有键的最快方法是什么?

    给定一个人口稠密的SortedList
  • 如何在Java中确定给定日期的前一天日期?

    我假设 Java 有一些内置的方法可以做到这一点 给定一个日期 如何确定该日期之前一天的日期 例如 假设给我的是 3 1 2009 上一个日期是 2009 年 2 月 28 日 如果给我的是 3 1 2008 那么之前的日期就是 2 29
  • 在 Swift 的条件语句中将可选值分配给新变量的原因

    我正在浏览 swift 文档 在可选部分中 它讨论了使用问号 表示可能为零的变量 这可以在 if 语句中使用来检查 nil 但在文档中 他们将可选值分配给条件中的新变量 是否有一个原因 例如 它出现在the docs与此类似 Declare