Что такое GraphemeCluster и что делает ExpressibleByExtendedGraphemeClusterLiteral ?

#swift #swift3

#swift #swift3

Вопрос:

Просматривая документацию ExpressibleByStringLiteral , я наткнулся ExpressibleByExtendedGraphemeClusterLiteral . Хотя я понимаю, что реализация первого позволяет использовать строковые литералы для инициализации чего-то другого, кроме String типа, я не уверен, для чего используется последний.

На самом деле, после некоторого поиска я не уверен, что такое кластер графем — может кто-нибудь объяснить, что это такое, а также, как это связано с протоколом, какую функциональность это обеспечивает, если реализовано?

Комментарии:

1. Вы смотрели на developer.apple.com/library/content/documentation/Cocoa /… и developer.apple.com/reference/swift /… ?

2. У меня не было, но теперь есть, спасибо.

Ответ №1:

Кластер графем представляет собой набор символов, которые вместе представляют отдельный символ, который пользователь увидит в строке на экране. Обычно он включает в себя «базовый символ» плюс то, что Apple называет «объединяющими знаками», и используется, например, когда нет доступного предварительно составленного отдельного символа Unicode, который мог бы выполнить эту работу за вас.

Когда кластеры графем используются в строках, вы должны проявлять особую осторожность, чтобы любые функции, ищущие подстроки и т. Д., Могли правильно разграничивать границы между кластерами.

Вы можете увидеть несколько примеров здесь:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html

Соответствие протоколу ExpressibleByExtendedGraphemeClusterLiteral просто означает, что рассматриваемый символ может быть инициализирован буквальным кластером графем. Опять же, вы можете увидеть примеры этого по ссылке выше.

Ответ №2:

Из Foundation:

     extension NSString : ExpressibleByStringLiteral {

        /// Create an instance initialized to `value`.
        required public convenience init(stringLiteral value: StaticString)

        /// A type that represents a string literal.
        ///
        /// Valid types for `StringLiteralType` are `String` and `StaticString`.
        public typealias StringLiteralType = StaticString

        /// A type that represents an extended grapheme cluster literal.
        ///
        /// Valid types for `ExtendedGraphemeClusterLiteralType` are `Character`,
        /// `String`, and `StaticString`.
        public typealias ExtendedGraphemeClusterLiteralType = StaticString

        /// A type that represents a Unicode scalar literal.
        ///
        /// Valid types for `UnicodeScalarLiteralType` are `Unicode.Scalar`,
        /// `Character`, `String`, and `StaticString`.
        public typealias UnicodeScalarLiteralType = StaticString
    }
  

Так что, похоже ExtendedGraphemeClusterLiteral , и UnicodeScalarLiteral просто StaticString