如何正确打开普通和隐式期权?
这个主题似乎有些混乱,我想对所有方法以及它们如何有用提供参考。
目前有两种创建选项的方法:
var optionalString: String?
var implicitOptionalString: String!
打开两者的方法有哪些?另外,在展开过程中使用!
和?
之间的区别是什么?
答案 0 :(得分:44)
有许多相似之处,只有少数差异。
声明:var opt: Type?
不安全展开:let x = opt!.property // error if opt is nil
安全地测试存在:if opt != nil { ... someFunc(opt!) ... } // no error
通过绑定安全地展开:if let x = opt { ... someFunc(x) ... } // no error
安全链接:var x = opt?.property // x is also Optional, by extension
安全地合并nil值:var x = opt ?? nonOpt
声明:var opt: Type!
不安全展开(隐含):let x = opt.property // error if opt is nil
通过作业不安全地展开:
let nonOpt: Type = opt // error if opt is nil
通过参数传递不安全地展开:
func someFunc(nonOpt: Type) ...
someFunc(opt) // error if opt is nil
安全地测试存在:if opt != nil { ... someFunc(opt) ... } // no error
安全链接:var x = opt?.property // x is also Optional, by extension
安全地合并nil值:var x = opt ?? nonOpt
答案 1 :(得分:7)
自Beta 5以来,我们还有新的合并运算符(??):
var a : Int?
let b : Int = a ?? 0
如果可选项是!= nil则将其解包,否则使用运算符右侧的值
答案 2 :(得分:2)
可选类型表示变量可能为nil。
示例:
var myString: Int? = 55
myString = nil
问号表示它可能没有值。
但如果你这样陈述:
var myString : Int = 55
myString = nil
会显示错误。
现在要检索打开它所需的值:
print(myString!)
但是如果你想自动解包:
var myString: Int! = 55
然后:
print(myString)
无需打开包装。希望它会有所帮助。
答案 3 :(得分:2)
我创建了一种包装可选值的方法:
OR
您也可以添加自定义数据类型。
用法:-
// MARK: - Modules
import Foundation
import UIKit
import CoreData
// MARK: - PROTOCOL
protocol OptionalType { init() }
// MARK: - EXTENSIONS
extension String: OptionalType {}
extension Int: OptionalType {}
extension Double: OptionalType {}
extension Bool: OptionalType {}
extension Float: OptionalType {}
extension CGFloat: OptionalType {}
extension CGRect: OptionalType {}
extension UIImage: OptionalType {}
extension IndexPath: OptionalType {}
extension Date: OptionalType {}
extension UIFont: OptionalType {}
extension UIColor: OptionalType {}
extension UIViewController: OptionalType {}
extension UIView: OptionalType {}
extension NSMutableDictionary: OptionalType {}
extension NSMutableArray: OptionalType {}
extension NSMutableSet: OptionalType {}
extension NSEntityDescription: OptionalType {}
extension Int64: OptionalType {}
extension CGPoint: OptionalType {}
extension Data: OptionalType {}
extension NSManagedObjectContext: OptionalType {}
prefix operator ?*
//unwrapping values
prefix func ?*<T: OptionalType>( value: T?) -> T {
guard let validValue = value else { return T() }
return validValue
}
希望它会有所帮助:)
答案 4 :(得分:0)
您还可以为特定类型创建扩展名,并使用默认值安全地展开。我做了以下相同的事情:
@ResponseBody
@RequestMapping(value = "/login",
method = RequestMethod.POST)
public ResponseWrapper<WebUser> login(...){
.
.
.
}
答案 5 :(得分:0)
使用绑定安全解包的代码示例:
let accountNumber = account.accountNumber //optional
let accountBsb = account.branchCode //optional
var accountDetails: String = "" //non-optional
if let bsbString = account.branchCode, let accString = account.accountNumber {
accountDetails = "\(bsbString) \(accString)" //non-optional
}