#swift #swift3
#swift #swift3
Вопрос:
Просматривая документацию ExpressibleByStringLiteral
, я наткнулся ExpressibleByExtendedGraphemeClusterLiteral
. Хотя я понимаю, что реализация первого позволяет использовать строковые литералы для инициализации чего-то другого, кроме String
типа, я не уверен, для чего используется последний.
На самом деле, после некоторого поиска я не уверен, что такое кластер графем — может кто-нибудь объяснить, что это такое, а также, как это связано с протоколом, какую функциональность это обеспечивает, если реализовано?
Комментарии:
1. Вы смотрели на developer.apple.com/library/content/documentation/Cocoa /… и developer.apple.com/reference/swift /… ?
2. У меня не было, но теперь есть, спасибо.
Ответ №1:
Кластер графем представляет собой набор символов, которые вместе представляют отдельный символ, который пользователь увидит в строке на экране. Обычно он включает в себя «базовый символ» плюс то, что Apple называет «объединяющими знаками», и используется, например, когда нет доступного предварительно составленного отдельного символа Unicode, который мог бы выполнить эту работу за вас.
Когда кластеры графем используются в строках, вы должны проявлять особую осторожность, чтобы любые функции, ищущие подстроки и т. Д., Могли правильно разграничивать границы между кластерами.
Вы можете увидеть несколько примеров здесь:
Соответствие протоколу 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