Swift: необязательный текст в необязательном значении

Как удалить текст 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

person Allan Macatingrao    schedule 11.09.2014    source источник
comment
какой-то пример кода? и вы не можете переопределить/прокрутить description для Optional   -  person Bryan Chen    schedule 11.09.2014


Ответы (3)


вы можете использовать ?? (нулевой оператор объединения), чтобы развернуть его и указать значение по умолчанию, если оно равно нулю

let sessionApiURL = self.session?.apiURL ?? ""
var url = "\(sessionApiURL)/api/products.json"
person Bryan Chen    schedule 11.09.2014
comment
Обратите внимание, что это хорошо работает только при работе с опциями типа String?. Вы не сможете сделать что-то вроде: let i: Int? = 88; let s = i ?? "nil" - person Jeremy; 15.06.2016

Вы можете использовать этот модуль http://cocoapods.org/pods/NoOptionalInterpolation.

В качестве альтернативы добавьте этот код в свой проект, чтобы удалить необязательный (...) и нулевой текст в интерполяции строк:

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() ?? "")
    }
}

Обратите внимание, что простое переопределение функции description для Optional не будет работать для интерполяции строк, хотя оно работает для print.

person Thanh Pham    schedule 27.05.2016
comment
Отличное решение здесь, и оно помогло мне улучшить собственный пользовательский оператор, чтобы он идеально обрабатывал вложенные опции. Для тех, кто не хочет переопределять функциональность по умолчанию, рассмотрите мой собственный ответ здесь. - person Jeremy; 15.06.2016

Если вы хотите обойтись без необязательного значения, вам нужно развернуть необязательный. Вы можете использовать «необязательную привязку», чтобы развернуть необязательный:

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

Вы можете проверить мой пример на онлайн-площадке Swift для лучшего понимания.

person slymnozdmrc    schedule 02.04.2018