2014-10-28 2 views
14

Я загружаю значение из словаря в plist, но когда я печатаю его на консоль, он печатает: Необязательно (название понедельника), а не просто «Название понедельника».Как напечатать строку из plist без опции «Необязательно»?

Как я могу избавиться от Необязательного() моего значения при печати?

var plistPath = NSBundle.mainBundle().pathForResource("days", ofType: "plist") 
var plistArray = NSArray(contentsOfFile: plistPath!) as NSArray! 

    for obj: AnyObject in plistArray { 
     if var dicInfo = obj as? NSDictionary { 
      let todayTitle: AnyObject? = dicInfo.valueForKey("Title") 
      println(todayTitle) 
     } 
    }  
+0

Попробуйте этот стручок https://github.com/T-Pham/NoOptionalInterpolation. Он делает именно это. –

ответ

36

Один из способов избавиться от Optional является использование восклицательного знака:

println(todayTitle!) 

Однако, вы должны делать это только тогда, когда вы уверены, что значение есть. Другой способ заключается в разворачивать и использовать условный, как это:

if let theTitle = todayTitle { 
    println(theTitle) 
} 

Вставить эту программу в runswiftlang для демо:

let todayTitle : String? = "today" 
println(todayTitle) 
println(todayTitle!) 
if let theTitle = todayTitle { 
    println(theTitle) 
} 
+0

Удивительный! Большое спасибо за быстрый ответ. Я все еще привык к этим опционам. –

+0

@vacawama Спасибо, что предупредили меня! Похоже, runswiftlang прекратил поддерживать онлайн-демонстрации, поэтому я скопировал код с повторным вводом кода и ввел его здесь с инструкциями о том, как попробовать int online. Я также удалил вопросительный знак. Спасибо! – dasblinkenlight

+0

Добавление "!" работал на меня. –

4

Другой, чуть более компактный, путь (явно спорно, но в наименее один вкладыш)

(result["ip"] ?? "unavailable").description.

В теории result["ip"] ?? "unavailable" должны работать тоже, но это не так, если в 2.2

Конечно, вместо «недоступен» с тем, что подходит вам: «ноль», «не найден» и т.д.

+1

Умный! Как отмечено @Jeremy, ваше значение по умолчанию должно быть того же типа, что и ваш дополнительный. Итак, если вы хотите распечатать необязательный Int: 'var i: Int ?; print ("i is: \ ((i ?? 0) .description)") // output: "i is 0" ' –

0

Я не уверен, что правильный процесс для ссылки на другие ответы, но my answer to a similar question здесь также применяется.

ответ Валентина работает достаточно хорошо опциями типа String?, но не будет работать, если вы хотите сделать что-то вроде:

let i? = 88 
print("The value of i is: \(i ?? "nil")") // Compiler error 
-1

инициализирует

Var text: string? = nil 

Печать

print("my string", text! as string) 

Это позволит избежать слова «необязательно» перед строкой.

+0

Это то же самое, что и [принятый ответ] (http://stackoverflow.com/a/26600328). – approxiblue

3

С некоторыми попытками, я думаю, что этот способ лучше.

(variableName ?? "default value")! 

?? Используйте для значения по умолчанию, а затем использовать ! для UnWrap необязательной переменной.

Вот пример,

var a:String? = nil 
var b:String? = "Hello" 

print("varA = \((a ?? "variable A is nil.")!)") 
print("varB = \((b ?? "variable B is nil.")!)") 

Это напечатает

varA = variable A is nil. 
varB = Hello 
0

Swift 3.1

От Swift 3, вы можете использовать String(describing:) распечатать необязательное значение. Но синтаксис довольно сосать, и результат нелегко увидеть в консольном журнале.

Чтобы создать согласованное значение nil, необходимо создать расширение Optional.

extension Optional { 
    var logable: Any { 
     switch self { 
     case .none: 
      return "⁉️" // Change you whatever you want 
     case let .some(value): 
      return value 
     } 
    } 
} 

Как использовать:

var a, b: Int? 
a = nil 
b = 1000 
print("a: ", a.logable) 
print("b: ", b.logable) 

Результат:

a: ⁉️ 
b: 1000 
Смежные вопросы