【问题标题】:Swift: Optional Text In Optional ValueSwift:可选值中的可选文本
【发布时间】:2018-04-02 19:29:00
【问题描述】:

如何在显示时删除可选值上的Optional("")文本而不强制为!

更新

// I have somthing like this declared outside class
// I put question mark wrapper since I don't know when this session might have a value
var url = "\(self.session?.apiURL)/api/products.json"

// private session
private var _session:Session?

class MyClass
{
   .
   .
   .


   // the value of apiURL depends on session, session has optional value and declared as
   // custom lazy loaded var session
   var session:Session?
   {
      get
      {  
         if _session == nil 
         {
           _session = // fetch from coredata store if there is an active session. Might return nil

           // if no active session
           if _session == nil
           {
              // I just print "No active session"
           }
         }

         // return _session may or may not contain any value
         return _session
      }
   }
}

当会话具有值时,url 具有值:

Optional("my_api_url_here")/api/products.json

【问题讨论】:

  • 一些示例代码?你不能覆盖/调配descriptionOptional

标签: swift optional


【解决方案1】:

您可以使用这个 pod http://cocoapods.org/pods/NoOptionalInterpolation

或者,将此代码添加到您的项目中以删除字符串插值中的 Optional(...) 和 nil 文本:

public protocol Unwrappable {
    func unwrap() -> Any?
}

extension Optional: Unwrappable {
    public func unwrap() -> Any? {
        switch self {
        case .None:
            return nil
        case .Some(let unwrappable as Unwrappable):
            return unwrappable.unwrap()
        case .Some (let some):
            return some
        }
    }
}

public extension String {
    init(stringInterpolationSegment expr: Unwrappable) {
        self = String(expr.unwrap() ?? "")
    }
}

请注意,简单地覆盖Optionaldescription 函数对字符串插值不起作用,尽管它适用于print

【讨论】:

  • 这里很棒的解决方案,它帮助我改进了我自己的自定义运算符以完美地处理嵌套的选项。对于那些不想覆盖默认功能的人,请考虑my own answer here
【解决方案2】:

您可以使用??(空合并运算符)将其解包并提供默认值(如果它为 nil)

let sessionApiURL = self.session?.apiURL ?? ""
var url = "\(sessionApiURL)/api/products.json"

【讨论】:

  • 请注意,这仅在使用 String? 类型的选项时才有效。您将无法执行以下操作:let i: Int? = 88; let s = i ?? "nil"
【解决方案3】:

如果你想没有可选值,你必须解开可选值。您可以使用“可选绑定”来打开 Optional:

if let url = self.session?.apiURL{
     //you can use url without optional
     print(url)
}

您可以在online swift playground 中查看我的示例以更好地理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2017-05-11
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多