Как использовать символьный индекс в Swift 3.1?

Я новичок в Swift. Я обнаружил странное поведение сопоставления нижних индексов:

struct SubscriptTest {
    subscript(character: Character) -> String {
        return "Character: \(character)"
    }

    subscript(string: String) -> String {
        return "String: \(string)"
    }

    subscript(int: Int) -> String {
        return "Int: \(int)"
    }
}

let test = SubscriptTest()
test["abc"] // String: abc
test[13] // Int: 13
test[""] // String:  (surprisingly)

Я думал, что последний тест будет соответствовать моим Character нижний индекс, а не String один. Я попытался поменять местами объявления подписчиков, думая, что, возможно, используется последний соответствующий. Это ничего не изменило, String индекс все еще используется для одного Character,

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

Почему Character нижний индекс здесь никогда не совпадал?

1 ответ

Решение

"" может быть как String буквальный и Character буквально, и по умолчанию String (если оба действительны в контексте). С

test["" as Character] // Character: 

или же

let c: Character = ""
test[c] // Character: 

Вы получите ожидаемый результат.

Другие вопросы по тегам