Как расширить тип словаря Swift, чтобы он возвращал непустую строку или ноль

Я записываю extension в Dictionary, чтобы, когда я даю ему ключ String, он возвращал мне String только в том случае, если значение, связанное с ключом, отлично от нуля и не пусто.

extension Dictionary {

    subscript(key: String) -> String? {
        if let string = super.subscript(key) {
            if string.isEmpty == false {
                return string
            }
        }
        return nil
    }

}

Однако в строке if let string = super.subscript(key) { я получаю следующую ошибку компиляции, и я не знаю, что это значит, и нет результата Google, который объясняет это:

Ожидается -> для типа элемента нижнего индекса

Я делаю это, потому что работаю с API, который возвращает JSON, где значение ключа может быть пустой строкой, что является недопустимым значением для приложения по нашим требованиям и, следовательно, так же хорошо, как ноль.

Конечно, более длинный путь работает, но я ищу способ сделать его короче.

if let value = dict["key"] as? String {
    if value.isEmpty == false {
        // The value is non-nil and non-empty.
    }
}

person MLQ    schedule 21.05.2015    source источник
comment
Не делай этого. Вместо этого сделайте if let value = dictionary["key"] as? String where !value.isEmpty { ... }   -  person mattt    schedule 21.05.2015
comment
@mattt Звучит хорошо, сделай это ответом, чтобы я мог его принять?   -  person MLQ    schedule 21.05.2015
comment
У Apple есть интересная статья на, возможно, связанную тему: developer.apple.com/swift/ блог/?id=12   -  person matt    schedule 21.05.2015
comment
Кстати, одна техническая проблема здесь заключается в том, что вы предполагаете, что ключи словаря являются строками, что не обязательно так. И вы не можете определить метод расширения, который применяется только к ограниченному типу универсального заполнителя.   -  person Martin R    schedule 21.05.2015
comment
Спасибо за наводку @MartinR. Думаю, тогда я пойду путем Мэтта.   -  person MLQ    schedule 21.05.2015


Ответы (1)


Вы подумаете, что это очень глупо, но я бы посоветовал: делайте более или менее точно то, что вы делаете, но инкапсулируйте это как отдельную функцию, а не пытайтесь разобраться с последствиями определения нового subscript:

extension Dictionary {
    func nes(key:Key) -> String? {
        var result : String? = nil
        if let s = self[key] as? String {
            if !s.isEmpty {
                result = s
            }
        }
        return result
    }
}

(nes означает «непустая строка».)

Теперь назовите его как d.nes("foo").

person matt    schedule 21.05.2015
comment
Я уже прибегал к написанию глобальной функции, которая делает то же самое, но я все еще не думаю, что это глупо! - person MLQ; 21.05.2015
comment
На самом деле глобальная функция должна была стать моим первым предложением! :))) Но потом я сказал себе, нет, давайте сэкономим себе один параметр. - person matt; 21.05.2015