Я думаю, что быстрый ответ для получения первого символа может быть:
let firstCharacter = aString[aString.startIndex]
Это намного элегантнее и эффективнее, чем:
let firstCharacter = Array(aString.characters).first
Но ... если вы хотите манипулировать и делайте больше операций со строками, которые вы могли бы подумать, создавая расширение. В этом подходе есть одно расширение, оно очень похоже на уже опубликованное здесь:
extension String {
var length : Int {
return self.characters.count
}
subscript(integerIndex: Int) -> Character {
let index = startIndex.advancedBy(integerIndex)
return self[index]
}
subscript(integerRange: Range<Int>) -> String {
let start = startIndex.advancedBy(integerRange.startIndex)
let end = startIndex.advancedBy(integerRange.endIndex)
let range = start..<end
return self[range]
}
}
НО ЭТО УЖАСНАЯ ИДЕЯ !!
Расширение ниже ужасно неэффективно. Каждый раз, когда к строке обращаются с помощью целого числа, запускается функция O (n) для продвижения ее начального индекса. Запуск линейного цикла внутри другого линейного цикла означает, что этот цикл for случайно равен O (n2) - при увеличении длины строки время, которое занимает этот цикл, увеличивается квадратично.
Вместо этого вы можете использовать коллекцию строк символов.
Похоже, у вас та же общая проблема, что и у исходного сериализатора DataContract, в отношении циклических ссылок. Хотя объекты, ссылающиеся друг на друга, довольно часто встречаются с графами объектов в памяти, такие циклические ссылки неизбежно приводят к бесконечным рекурсиям при сериализации, если сериализатор не учитывает это специально. Существует несколько установленных стандартов для работы с циклическими ссылками в распространенных небинарных форматах сериализации (XML и JSON являются двумя наиболее распространенными).
Microsoft решила циклическую проблему для сериализатора DataContract в .NET 3.5 SP1. за счет использования семантики ref в xml. Насколько мне известно, для JSON такого нет, и, возможно, именно поэтому JSON.NET не позволяет вам сериализовать граф объекта.
Я бы удостоверился, что в вашем графе объектов есть только ссылки, по которым можно перемещаться в одном направлении, а не в обоих направлениях (т.е. только от родителя к потомку, а не от ребенка к родителю). Эти родительский / дочерний и дочерний / родительский типы являются наиболее распространенные типы циклических ссылок. Также может случиться так, что дочерний элемент нижнего уровня в конечном итоге ссылается на корень графа, вызывая создание косвенного циклического графа (однако, они, как правило, гораздо реже, чем циклы родительский / дочерний).
Как только вы Удалите любые циклические ссылки в графе объектов, вы сможете сериализовать.
Я бы удостоверился, что в вашем графе объектов есть только ссылки, по которым можно перемещаться в одном направлении, а не в обоих направлениях (т.е. только от родителя к потомку, а не от ребенка к родителю). Эти родительский / дочерний и дочерний / родительский типы являются наиболее распространенные типы циклических ссылок. Также может случиться так, что дочерний элемент нижнего уровня в конечном итоге ссылается на корень графа, вызывая создание косвенного циклического графа (однако, они, как правило, гораздо реже, чем циклы родительский / дочерний).
Как только вы Удалите любые циклические ссылки в графе объектов, вы сможете сериализовать.
Я бы удостоверился, что в вашем графе объектов есть только ссылки, по которым можно перемещаться в одном направлении, а не в обоих направлениях (т.е. только от родителя к потомку, а не от ребенка к родителю). Эти родительский / дочерний и дочерний / родительский типы являются наиболее распространенные типы циклических ссылок. Также может случиться так, что дочерний элемент нижнего уровня в конечном итоге ссылается на корень графа, вызывая создание косвенного циклического графа (однако, они, как правило, гораздо реже, чем циклы родительский / дочерний).
Как только вы Удалите любые циклические ссылки в графе объектов, вы сможете сериализовать.