什么是Optional(可选项或者叫可选类型)?

在变量类型后加问号(?)表示该变量可能有值也可能没有值
底层Optional是一个包含None和Some(Wrapped)两种类型的泛枚举类型,Optional.None即nil,Optional.Some非nil。

@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    /// The absence of a value.
    ///
    /// In code, the absence of a value is typically written using the `nil`
    /// literal rather than the explicit `.none` enumeration case.
    case none

    /// The presence of a value, stored as `Wrapped`.值的存在,存储为“Wrapped”
    case some(Wrapped)
}
var optional1: String? = nil
 var optional2: String? = .none

在OC中, nil是一个指向不存在对象的指针(OC非对象类型也可以设置成nil但是会有警告⚠️:指针不兼容)
在Swift中,nil不是指针,而是值缺失的一种特殊类型,任何类型的可选项都可以设置为nil而不仅仅是对象类型,Swift 是一种类型安全的语言,而 Objective-C 不是。这意味着在 Swift 中,每个类型的 nil 都是不同的,例如 Int? 的 nil 和 String? 的 nil 是不同的,它们所代表的空值的类型不同。
非可选项类型,不可设置为nil。Optional及可以包装值类型也可以包装引用类型。

### Python 中 Optional 类型的定义与用法 在 Python 的类型提示(Type Hinting)体系中,`Optional[type]` 是一种特殊的泛型容器,用于表示某个变量可能为指定类型 `type` 或者为 `None`。这种设计通常用来增强代码可读性和静态分析工具的能力。 #### 定义 `Optional[X]` 实际上是一个快捷方式,等价于 `Union[X, None]`[^4]。这意味着如果一个参数被标记为 `Optional[int]`,那么它既可以接受整数类型的值,也可以接受 `None` 作为输入。 以下是官方文档中的描述: > The `Optional` type is a shorthand notation for specifying that a value can either be of the specified type or `None`. #### 使用场景 当函数的一个参数可能是某种特定数据类型或者完全不存在时,可以使用 `Optional` 来标注该参数。这有助于开发者更清晰地理解接口的设计意图,并允许 IDE 和其他工具提供更好的支持。 例如,在下面的例子中展示了如何利用 `Optional[str]` 表达字符串或无值的情况: ```python from typing import Optional def greet(name: Optional[str]) -> str: if name is not None and isinstance(name, str): return f"Hello, {name}!" else: return "Hello, Guest!" print(greet("Alice")) # 输出 Hello, Alice! print(greet(None)) # 输出 Hello, Guest! ``` 上述代码片段通过导入 `typing.Optional`, 明确指出 `greet()` 函数接收的名字参数要么是个有效的字符串对象要么就是未赋任何实际意义即为空(`None`)的状态. 另外值得注意的是虽然这里演示了基本的数据结构像字符串的应用情况但实际上几乎所有内置以及自定义复杂类都可以配合此机制一起工作只要遵循相应的语法规则即可[^5]. 对于网络请求库如 Requests 提供的功能说明里提到过类似的选项设置方法其中某些关键字参数也采用了相似的方式来进行默认行为配置比如我们之前见过关于获取资源路径时候附加额外查询条件的部分: ```python import requests from typing import Dict, Optional response = requests.get( url="https://example.com", params={"key": "value"}, # 可选字典形式传递给 URL 查询串部分. ) # 假设定义了一个辅助封装版本简化调用过程如下所示: def fetch_data(api_endpoint: str, query_params: Optional[Dict[str, str]] = None) -> dict: response = requests.get(url=api_endpoint, params=query_params) return response.json() result = fetch_data("http://testserver", {"search_term": "keyword"}) ``` 在这里可以看到除了常规必填项之外还存在另一个带有缺省状态(也就是如果没有显式传入的话就保持空白列表状态)的关键字实参从而实现了更加灵活多变的实际应用场景需求满足程度提升效果显著.[^2] 最后值得一提的是有时候即使重新安装整个解释器环境也可能无法解决所有潜在兼容性方面的问题所以必要时刻考虑升级相关依赖包甚至切换不同发行版之间相互适配关系调整策略不失为明智之举之一.[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值