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.”
解决方法
从快速界面:
/// 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 举报,一经查实,本站将立刻删除。