在可选项中包装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: ()) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Difference between Composition and Aggregatio
- ruby-on-rails – 播种时是否可能有rails记录错误
- 详解C#设计模式编程中的模板方法模式使用
- uitableview – 没有行动画动画的ReloadRowsAtIn
- ruby-on-rails – 在测试期间模拟当前日期
- 四种生成和解析XML文档的方法详解(介绍+优缺点比
- flash urlrequest拼接url+参数只是简单的1 + 2 =
- Coursera公开课笔记: 斯坦福大学机器学习第七课“
- swift – 使用计时器定期更新NSTableCellView内的
- ruby-on-rails – xmpp服务器和ruby on rails集成