Имели ту же самую проблему с экземпляром календаря.
Неверный код:
Calendar myCalendar = Calendar.getInstance();
for (int days = 0; days < daysPerWeek; days++) {
myCalendar.add(Calendar.DAY_OF_YEAR, 1);
// In the next line lies the error
Calendar newCal = myCalendar;
calendarList.add(newCal);
}
Вам нужно создать НОВЫЙ объект календаря, который можно выполнить с помощью calendar.clone()
;
Calendar myCalendar = Calendar.getInstance();
for (int days = 0; days < daysPerWeek; days++) {
myCalendar.add(Calendar.DAY_OF_YEAR, 1);
// RIGHT WAY
Calendar newCal = (Calendar) myCalendar.clone();
calendarList.add(newCal);
}
Две опции (существуют больше):
Scanner
let str = "123456Z789456123"
let scanner = Scanner(string: str)
var output : NSString?
scanner.scanUpToCharacters(from: .letters, into: nil)
scanner.scanCharacters(from: .alphanumerics, into: &output)
print(output! as String)
Регулярное выражение для поиска первого символа нецифры
let str = "123456Z789456123"
let range = str.range(of: "\\D", options: .regularExpression)!
let output = str[range.lowerBound...]
var str = "123456Z789456123"
let characterSet = CharacterSet(charactersIn: "ZKUD")
let firstIndex = str.firstIndex { characterSet.contains([110].unicodeScalars.first!) }
let substr = str[firstIndex!...]
Или расширение использования:
var str = "123456Z789456123" // output: Z789456123
extension String {
func strip(before characterSet: CharacterSet) -> String {
if let firstIndex = self.firstIndex(where: { characterSet.contains([111].unicodeScalars.first!) }) {
return String(self[firstIndex...])
}
return self
}
func stripBeforeLetters() -> String {
return strip(before: .letters)
}
}
let substr = str.strip(before: CharacterSet(charactersIn: "ZKUD"))
let anotherSubstr = str.stripBeforeLetters()
Вот краткая острота:
let subStr = String(str.drop { [110].isNumber })
Это было бы отбрасывание символы с начала строки, пока они - цифры путем проверки или .isNumber
или .isWholeNumber
свойства Character.