Позволяет использовать отрицательные индексы
Всегда полезно не всегда писать string[string.length - 1]
, чтобы получить последний символ при использовании расширения нижнего индекса. Это расширение ( Swift 3 ) допускает отрицательные индексы Range и CountableClosedRange.
extension String {
var count: Int { return self.characters.count }
subscript (i: Int) -> Character {
// wraps out of bounds indices
let j = i % self.count
// wraps negative indices
let x = j < 0 ? j + self.count : j
// quick exit for first
guard x != 0 else {
return self.characters.first!
}
// quick exit for last
guard x != count - 1 else {
return self.characters.last!
}
return self[self.index(self.startIndex, offsetBy: x)]
}
subscript (r: Range<Int>) -> String {
let lb = r.lowerBound
let ub = r.upperBound
// quick exit for one character
guard lb != ub else { return String(self[lb]) }
return self[self.index(self.startIndex, offsetBy: lb)..<self.index(self.startIndex, offsetBy: ub)]
}
subscript (r: CountableClosedRange<Int>) -> String {
return self[r.lowerBound..<r.upperBound + 1]
}
}
Как его использовать:
var text = "Hello World"
text[-1] // d
text[2] // l
text[12] // e
text[0...4] // Hello
text[0..<4] // Hell
Для более тщательного программиста: включите guard
против пустых строк в этом расширении
subscript (i: Int) -> Character {
guard self.count != 0 else { return '' }
...
}
subscript (r: Range<Int>) -> String {
guard self.count != 0 else { return "" }
...
}
Вы можете используйте ключевые слова subversion:
По сути, у вас может быть вспомогательный метод ...
def app_version
"$Id$"
end
$ Id $
- ключевое слово, которое svn будет расширять (ссылка выше содержит другие, которые вы можете использовать). Теперь мы устанавливаем свойство ключевых слов в этом файле, чтобы svn знал, что он должен заменить ключевые слова (предположим, application_helper.rb):
svn propset svn:keywords "Id" application_helper.rb
svn ci application_helper.rb
Теперь, если вы посмотрите на application_helper.rb, он прочитает (что-то вроде этого, с версия, дата, имя пользователя изменено)
def app_version
"$Id: application_helper.rb 282 2009-06-26 10:34:17Z root $"
end
Очевидно, вы можете назначить это переменной и проанализировать ее до необходимого формата, включить ее в свои шаблоны просмотра и т. д. Или сделайте то же самое, но вместо application_helper.rb просто используйте файл с именем VERSION
в корневом каталоге.
You could either version by labelling your git / svn branch ... or, best way, a constant in the environment file, just like Rails does:
MY_APP_VER = 0.1
Why would you use the application helper? You can always get at that variable from your application helper should you need to display it onscreen. But, that seems silly to have logic belonging to the configuration of your entire application inside a helper method.
Я думаю, это должна быть ответственность вашей системы управления версиями. Я бы использовал тег для каждой версии, тогда вы можете создать вспомогательный метод, который просто записывает тег в вашем приложении (скажем, в нижний колонтитул):
def put_version
"<p id='version'>#{$$TAG_NAME}</p>"
end
Не могу вспомнить синтаксис для вставки имени тега.
Плагин версии приложения ( http://github.com/toland/app_version/tree/master ) позволяет указать различные компоненты версии приложения. Затем вы можете включить ревизию Subversion в качестве компонента сборки, не являясь доминирующей частью.
Вы также можете, как часть рабочего процесса сборки / тестирования, увеличить еще один компонент версии.