Внимание: Пожалуйста, смотрите Ответ Льва Дабуса для правильной реализации Swift 4.
Тип Substring
был введен в Swift 4, чтобы сделать подстроки более быстрыми и эффективными за счет совместного использования памяти с исходной строкой, так что именно это должны возвращать функции нижнего индекса.
extension String {
subscript (i: Int) -> Character {
return self[index(startIndex, offsetBy: i)]
}
subscript (bounds: CountableRange) -> Substring {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(startIndex, offsetBy: bounds.upperBound)
return self[start ..< end]
}
subscript (bounds: CountableClosedRange) -> Substring {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(startIndex, offsetBy: bounds.upperBound)
return self[start ... end]
}
subscript (bounds: CountablePartialRangeFrom) -> Substring {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(endIndex, offsetBy: -1)
return self[start ... end]
}
subscript (bounds: PartialRangeThrough) -> Substring {
let end = index(startIndex, offsetBy: bounds.upperBound)
return self[startIndex ... end]
}
subscript (bounds: PartialRangeUpTo) -> Substring {
let end = index(startIndex, offsetBy: bounds.upperBound)
return self[startIndex ..< end]
}
}
extension Substring {
subscript (i: Int) -> Character {
return self[index(startIndex, offsetBy: i)]
}
subscript (bounds: CountableRange) -> Substring {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(startIndex, offsetBy: bounds.upperBound)
return self[start ..< end]
}
subscript (bounds: CountableClosedRange) -> Substring {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(startIndex, offsetBy: bounds.upperBound)
return self[start ... end]
}
subscript (bounds: CountablePartialRangeFrom) -> Substring {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(endIndex, offsetBy: -1)
return self[start ... end]
}
subscript (bounds: PartialRangeThrough) -> Substring {
let end = index(startIndex, offsetBy: bounds.upperBound)
return self[startIndex ... end]
}
subscript (bounds: PartialRangeUpTo) -> Substring {
let end = index(startIndex, offsetBy: bounds.upperBound)
return self[startIndex ..< end]
}
}
Чтобы преобразовать Substring
в String
, вы можете просто сделать String(string[0..2])
, но вы должны делать это только если вы планирую держать подстроку вокруг. В противном случае более эффективно сохранить его Substring
.
1137 Было бы замечательно, если бы кто-нибудь смог найти хороший способ объединить эти два расширения в одно. Я попытался расширить StringProtocol
безуспешно, потому что метод index
там не существует.
& nbsp;
extension String {
subscript (i: Int) -> Character {
return self[index(startIndex, offsetBy: i)]
}
subscript (i: Int) -> String {
return String(self[i] as Character)
}
subscript (r: Range) -> String {
let start = index(startIndex, offsetBy: r.lowerBound)
let end = index(startIndex, offsetBy: r.upperBound)
return self[Range(start ..< end)]
}
}
& nbsp;
Apple предоставляет следующее объяснение ( найдено здесь ):
Подписывание строк с целыми числами недоступно.
Понятие «
i
-й символ в строке» имеет разные интерпретации в разных библиотеках и компонентах системы. Правильная интерпретация должна быть выбрана в соответствии со случаем использования и задействованными API, поэтомуString
не может быть подписано целым числом.Swift предоставляет несколько различных способов доступа к символьным данным, хранящимся внутри строк.
String.utf8
- это набор кодовых единиц UTF-8 в строке. Используйте этот API при преобразовании строки в UTF-8. Большинство API POSIX обрабатывают строки в единицах кода UTF-8.
String.utf16
- это набор кодовых единиц UTF-16 в виде строки. Большинство сенсорных API-интерфейсов Какао и Какао обрабатывают строки в единицах кода UTF-16. Например, экземплярыNSRange
, используемые сNSAttributedString
иNSRegularExpression
, хранят смещения и длины подстрок в единицах кода UTF-16.
String.unicodeScalars
- это коллекция скаляров Unicode. Используйте этот API, когда вы выполняете низкоуровневую манипуляцию с символьными данными.
String.characters
представляет собой набор расширенных кластеров графем, которые являются приближением воспринимаемых пользователем символов.Обратите внимание, что при обработке строк, содержащих читаемый человеком текст, следует избегать посимвольной обработки в максимально возможной степени. Вместо этого используйте высокоуровневые чувствительные к локали алгоритмы Unicode, например,
String.localizedStandardCompare()
,String.localizedLowercaseString
,String.localizedStandardRangeOfString()
и т. Д.
Проблема с этой версией заключается в том, что программа пытается запустить файл /bin/unpack200
, который не существует. Однако файл /usr/bin/unpack200
существует. Это связано с тем, что этот файл находится в разных местах в зависимости от архитектуры используемой машины - если он 32-битный, он находится в одном месте, если он 64-битный, он находится в другом.
У меня возникла эта проблема, потому что файл был создан для работы на 32-битной архитектуре, но я использую 64-битную машину.
Поэтому, чтобы решить эту проблему, необходимо установить 32-битные библиотеки. Для этого просто наберите: sudo apt-get install ia32-libs
.
Источник: