加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在可选项中包装swift变量的简写?

发布时间:2020-12-14 05:00:31 所属栏目:百科 来源:网络整理
导读:Swift允许我们使用速记符号str!打开一个可选的.但是,如果我们想做相反的事情呢? 说我有一个变量: var str = String() // String 是否有任何简写符号将其转换为可选(即String?或String!)? (例如,我想做一些像var strOptional =?(str)的事情.) 或者,如
Swift允许我们使用速记符号str!打开一个可选的.但是,如果我们想做相反的事情呢?

说我有一个变量:

var str = String() // String

是否有任何简写符号将其转换为可选(即String?或String!)?

(例如,我想做一些像var strOptional =?(str)的事情.)

或者,如果没有这种表示法的简写,如何在没有明确提及其类型的情况下将其转换为可选(例如,我不想提及字符串).

换句话说,我知道我可以使用以下任何方法将变量包装为可选:

var strOptional = str as String?
var strOptional: String? = str
var strOptional = String?(str)

…但在每种情况下,我都必须明确地写String.

我宁愿写一些像:var strOptional = str as typeof?(str),如果没有简写语法. (优点是如果变量的类型在代码库中经常更改,那么更新的位置就会少一些.)

至于这个有用的实际示例,想象一下我想使用AVCaptureDevice并使用以下代码:

let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
device.lockForConfiguration(nil)

lockForConfiguration()将在没有摄像机的设备上运行时崩溃,编译器不会警告我.原因是defaultDeviceWithMediaType可能会根据文档[1]返回nil,但它被定义为返回AVCaptureDevice!.

要修复这样的错误API,最好做以下事情:

let device = ?(AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo))

…获取AVCaptureDevice?并让编译器捕获我可能犯的任何错误.

目前,我必须诉诸于更加冗长:

let device: AVCaptureDevice? = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

另一个例子:

在这种情况下,我想为我的变量提供一个默认值,这是一个字符串,但是稍后,我可能想给它分配一个nil值.

var myString = "Hi"
// ...
if (someCondition()) {
    myString = nil // Syntax error: myString is String
}

目前我不得不求助于var myString:String? =“嗨”但像var myString =?(“Hi”)之类的东西会更简洁.

[1]如果打开AVCaptureDevice.h,您将看到有关返回值的以下文档:“具有给定媒体类型的默认设备,如果不存在具有该媒体类型的设备,则为nil.”

解决方法

可选只是swift中的枚举,所以你可以这样做:可选(str)

从快速界面:

/// A type that can represent either a `Wrapped` value or `nil`,the absence
/// of a value.
public enum Optional<Wrapped> : _Reflectable,NilLiteralConvertible {
    case None
    case Some(Wrapped)
    /// Construct a `nil` instance.
    public init()
    /// Construct a non-`nil` instance that stores `some`.
    public init(_ some: Wrapped)
    /// If `self == nil`,returns `nil`.  Otherwise,returns `f(self!)`.
    @warn_unused_result
    public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U?
    /// Returns `nil` if `self` is `nil`,`f(self!)` otherwise.
    @warn_unused_result
    public func flatMap<U>(@noescape f: (Wrapped) throws -> U?) rethrows -> U?
    /// Create an instance initialized with `nil`.
    public init(nilLiteral: ())
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读