你如何打开Swift选项?

时间:2014-08-08 03:16:48

标签: swift optional

如何正确打开普通和隐式期权?

这个主题似乎有些混乱,我想对所有方法以及它们如何有用提供参考。

目前有两种创建选项的方法:

var optionalString: String?

var implicitOptionalString: String!

打开两者的方法有哪些?另外,在展开过程中使用!?之间的区别是什么?

6 个答案:

答案 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
}