Давайте посмотрим на некоторый ваш код и посмотрим, что он дает странные результаты:
let time12 = (String(format: "%02d", time1))
Эта строка не имеет смысла, формат %02d
говорит о значении, которое нужно отформатировать (преобразовать в String
представление) является целым числом, и преобразование должно быть шириной 2 цифры с начальным нулем.Однако ваш аргумент time1
- это значение String
, а не целое число.
К сожалению, Swift не указывает вам на эту ошибку, скорее он просто кусается.Из-за того, как работает String(format:...)
- он принимает переменное число аргументов - обычная проверка типов в Swift отменена, и то, что вы получаете, является десятичным представлением (возможно, частью) машинного адреса time1
.Запустите свой код несколько раз на игровой площадке, и вы получите разные ответы!
Так что будьте очень осторожными при использовании String(format:...)
.
Здесь неясно, кто выпытаясь сделать с этой строкой, у вас есть значение String
и вы хотите извлечь из него два целочисленных значения, так зачем начинать с производства String
(let time12 = String(...time1...)
)?
let time10 = time12.prefix(2)
let time11 = time1.suffix(2)
Пропусксмешивая, какая переменная (time12
, time1
) содержит ваш String
здесь вы предполагаете, что строка точно соответствует формату;но одна из ваших тестовых строк - "1:20"
, поэтому даже если эти операторы ссылаются на правильные переменные, в этом случае вы получите "1:"
и "20"
.
Что вы можете сделать, чтобы разделитьСтроки в две части использовать функцию String
split(separator:maxSplits:omittingEmptySubsequences:)
, проверьте документацию для ее полного описания.Здесь вы можете написать:
let time1parts = time1.split(separator: ":", omittingEmptySubsequences:false)
let time2parts = time2.split(separator: ":", omittingEmptySubsequences:false)
print("\(time1) -> \(time1parts)")
print("\(time2) -> \(time2parts)")
Для ваших двух тестовых строк будет выведено:
10:30 -> ["10", "30"]
1:20 -> ["1", "20"]
Теперь вы должны проверить, что каждый массив (time1parts
, time2parts
) имеет точнодва элемента, которые оставлены в качестве упражнения.
Сделав это, вы можете преобразовать элементы в целые числа без знака (на тот случай, если кто-то введет знак минуса).Например:
let hours1 = UInt(time1parts[0])
let minutes1 = UInt(time1parts[1])
print("\(String(describing: hours1)) | \(String(describing: minutes1))")
Это выводит:
Optional(10) | Optional(30)
Теперь вам нужно проверить, что необязательные (Uint?
) значения не равны nil
, что каждое значение находится в правильном диапазоне(например, от 0 до 59 в течение нескольких минут, тип Range
и его метод contains()
могут помочь вам в этом) и сделайте свою математику.
Примечание: у вас есть проблема в том, что вы предполагаете 1:20
Это PM, вам нужно обратиться к этому, ваша математика никогда не будет правильной.Может быть, использовать 24-часовые часы (13:20
)?
Если вы застряли дальше, задайте новый вопрос, показывающий разработанный вами код, и объясните свою проблему, кто-то, несомненно, поможет вам в этом.