使用 ? (可选)在 Swift 变量中 [重复]

Posted

技术标签:

【中文标题】使用 ? (可选)在 Swift 变量中 [重复]【英文标题】:Using ? (optionals) in Swift variables [duplicate] 【发布时间】:2014-06-03 21:47:33 【问题描述】:

在 Swift 中的属性定义到底有什么区别:

var window: UIWindow?

var window: UIWindow

我读过它基本上是一个“可选”,但我不明白它的用途。

这是在创建一个名为 window 的类属性,对吗?那么'?'的需要是什么

【问题讨论】:

在文档中了解它:developer.apple.com/library/prerelease/ios/documentation/Swift/…。这是 Swift 的一个基本概念 此外,对这个问题的所有反对票都无缘无故地让我不想在这里尽我所能提供帮助。 我认为在这种情况下,窗口可能未初始化/不可用。因此,通过将其定义为optional,如果您调用window.addSubView(),它将不会解包而只是返回nil optional 的更好示例是delegate 属性。这将允许您在不检查delegate 是否为nil 的情况下调用delegate.protocolFunction()。请务必在文档中阅读有关它的内容,尽管它在解释方面做得很好! 回答编辑后发现已经有人问过了。 【参考方案1】:

? identifier 表示该变量是可选的,这意味着它的值可以是nil。如果您的代码中有一个值,将其声明为非可选允许编译器在构建时检查它是否有机会变为 nil。

你可以在if语句中检查它是否为nil:

var optionalName: String? = "John Appleseed"

if optionalName 
    // <-- here we know it's not nil, for sure!

许多要求参数为非 nil 的方法将明确声明它们需要一个非可选值。如果您有一个可选值,您可以通过 unwrapping 将其转换为非可选值(例如,UIWindow? -> UIWindow)。展开的主要方法之一是 if let 语句:

var greeting = "Hello!"

// at this point in the code, optionalName could be nil

if let name = optionalName 
    // here, we've unwrapped it into name, which is not optional and can't be nil
    greeting = "Hello, \(name)"

请参阅The Swift Programming Language,第 11 页了解简要介绍,或第 46 页了解更详细的说明。

【讨论】:

【参考方案2】:

UIWindow? 表示该值可能不存在。它要么是 UIWindow 实例,要么什么都没有。

【讨论】:

以上是关于使用 ? (可选)在 Swift 变量中 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Swift 可选属性声明之间的区别 [重复]

Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]

关于swift中的可选类型

无需重新分配变量即可展开 Swift 可选

Swift学习笔记之---使用if和let处理空变量

Swift学习笔记之---使用if和let处理空变量