UUID в общем коде
expect / actual
В модуле с Android- и iOS-таргетами commonMain не может импортировать java.util.UUID. Для тренировки платформенной границы сохрани класс Note в commonMain и реализуй expect fun randomId(): String через actual для Android и iOS.
Договор: lowercase UUID-строка стандартного вида с дефисами; ID вычисляется один раз при создании Note и не меняется при повторном чтении. Разные вызовы генерируют случайные идентификаторы, но абсолютная математическая уникальность не обещается.
Раздели решение на файлы commonMain/androidMain/iosMain в одном package. Проверь обе сборки, формат строки и стабильность ID одного Note. Код в одном редакторе показан как несколько файлов с комментариями.
В обычном проекте с Kotlin 2.4.0+ можно использовать общий kotlin.uuid.Uuid.random() без собственной платформенной обёртки; здесь expect/actual — явное учебное условие. Стабилизация UUID.
Сохранённый код превышает предел редактора. Скачай его перед сбросом; исходная запись сохранена.
Actual в iosMain используется соответствующими iOS-таргетами; объявления должны иметь одинаковый package и совместимые сигнатуры. NSUUID берётся из платформенной Foundation. Expect/actual, официальный пример платформенного UUID.
Lowercase нормализует регистр строк между платформами; это часть договора данной задачи. Инициализатор val вызывается при создании Note, а не при каждом чтении свойства.
Утверждение «Uuid пока experimental» без версии устарело: основной API стабилен с Kotlin 2.4.0. При этом отдельные generateV4/generateV7 остаются experimental; стабильный random не требует замены на них. Kotlin 2.4.0, Uuid.random. Android/iOS actual-реализации здесь не компилировались.