web-dev-qa-db-ja.com

「オプション」なしでplistから文字列を出力する方法は?

Plistのディクショナリから値をロードしますが、コンソールに出力すると、「Monday Title」だけでなく、Optional(Monday Title)が出力されます。

印刷時に値のOptional()を取り除くにはどうすればよいですか?

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)
        }
    }    
18
Rob Puryear

Optionalを取り除く1つの方法は、感嘆符を使用することです。

println(todayTitle!)

ただし、値が存在することが確実な場合にのみ、それを行う必要があります。別の方法は、次のようにアンラップして条件を使用することです。

if let theTitle = todayTitle {
    println(theTitle)
}

このプログラムを runswiftlang に貼り付けてデモを行います。

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

少し試してみると、この方法の方が良いと思います。

(variableName ?? "default value")!

デフォルト値には??を使用し、オプション変数のラップ解除には!を使用します。

ここに例があります

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
6
Johnny

別の、もう少しコンパクトな方法(明らかに議論の余地がありますが、少なくとも1つのライナーです)

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

理論的には result["ip"] ?? "unavailable"も機能するはずですが、2.2でない限り機能しません。

もちろん、「利用不可」を「nil」、「not found」など、あなたに合ったものに置き換えてください。

4
Valentin Radu

他の回答にリンクするための適切なプロセスが何であるかはわかりませんが、 同様の質問に対する私の回答 がここにも適用されます。

バレンティンの答えは、タイプString?のオプションに対して十分に機能しますが、次のようなことをしたい場合は機能しません。

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

Swift 3.1

Swift 3から、String(describing:)を使用してオプションの値を出力できますが、構文は非常に難しく、結果はコンソールログで簡単に確認できません。

Optionalの拡張を作成して、一貫したnil値を作成します。

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
0
nahung89