微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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: ())
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐