10

拡張機能を実装しようとしていますが、Dictionaryオプションの値を処理したいと考えています。しかし、何をしても、[String: String?]辞書でメソッドを使用すると、オプションで値をバインドできません。オプションの値を適切に処理する辞書の拡張機能をどのように作成しますか?


次の拡張機能を検討してください。

extension Dictionary {
    func someMethod() {
        for (key, value) in self {
            if let valueString = value as? String {
                println("  \(key) = \(valueString)")
            } else {
                println("  \(key) = \(value) cannot be cast to `String`")
            }
        }
    }
}

したがって、次のコードを検討してください。

let dictionary: [String: AnyObject?] = ["foo": "bar"]
dictionary.someMethod()

そしてそれは不思議なことに報告します

foo = Optional(bar) cannot be cast to `String`

オプションの値を持つディクショナリ パラメーターを処理する非拡張メソッドを作成できますが、Dictionary.

4

2 に答える 2

4

リフレクションでこれを行うことができます。すでに持っているよりも多くのコードは必要ありません:

extension Dictionary
{
    func someMethod()
    {
        for (key, value) in self
        {
            var valueRef = _reflect(value)

            while valueRef.disposition == .Optional && valueRef.count > 0 && valueRef[0].0 == "Some"
            {
                valueRef = valueRef[0].1
            }

            if let valueString: String = valueRef.value as? String
            {
                print("  \(key) = \(valueString)")
            }
            else
            {
                print("  \(key) = \(value) cannot be cast to `String`")
            }
        }
    }
}

let dictionary: [String : AnyObject?] = ["foo" : "bar"]
dictionary.someMethod()

戻り値

foo = bar

let dictionary: [String : AnyObject?] = ["foo" : nil]
dictionary.someMethod()

戻り値

foo = nil cannot be cast to `String`

let dictionary: [String : AnyObject?] = ["foo" : UIViewController()]
dictionary.someMethod()

戻り値

foo = Optional(<UIViewController: 0x7fee7e819870>) cannot be cast to `String`
于 2015-02-05T20:01:16.957 に答える
0

「:String?」を挿入しても問題ありません。以下に示すように、valueString の直後:

extension Dictionary {
    func someMethod() -> Bool {
        for (key, value) in self {
            if let valueString:String? = value as? String {
                println("  \(key) = \(valueString)")
            } else {
                println("  \(key) = \(value) cannot be cast to `String`")
                return false
            }
        }
        return true
    }
}

func doSomething() {
    let dictionary: [String: AnyObject?] = ["foo": "bar"]
    if dictionary.someMethod() {
        println("no problems")
    } else {
        println("casting issues")
    }
}
于 2015-01-06T02:39:08.423 に答える