Swift Forums
Request for feedback: emitting warnings when weak capture list items cause strong captures
i have an outstanding draft PR that i've been trying to progress recently in which i'm looking to add diagnostics for situations like the following (example copied from this issue): class ClosureWrapper { var closure: () -> Void = {} init() { …
После последних proposal, на которых основано текущее поведение захватов
Появилось важное изменение в Swift Compiler
Давайте разберемся в чем суть:
С захватом слабых ссылок в замыканиях всё давно понятно. Есть риск retain cycle, пишем:
{ [weak self] in
self?.update()
}Но есть неприятный случай с вложенными замыканиями, который раньше Swift вообще не подсвечивал:
Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { _ in
service.load { [weak self] result in
self?.result = result
}
}Выглядит безопасно.
self ведь захватывается слабой ссылкой. Но только во внутреннем замыкании. Чтобы внутреннее замыкание вообще смогло создать weak self, внешнему замыканию тоже нужен доступ к self. И Swift неявно захватывает его там уже сильной ссылкой. Получается примерно такая цепочка:self → Timer → внешнее замыкание → selfИ здравствуй retain cycle. Самое неприятное, что в Swift 6.3 такой код спокойно компилировался без единого предупреждения. В Swift 6.4 это наконец меняется. Компилятор покажет:
'weak' ownership of capture 'self' differs from implicitly-captured strong reference in outer scopeТо есть буквально:
Ты во внутреннем замыкании захватываешь
self слабо, но снаружи я уже неявно захватил его сильно. Как исправить?
В большинстве случаев достаточно перенести захват слабой ссылки во внешнее замыкание:
Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { [weak self] _ in
service.load { result in
self?.result = result
}
}Теперь внешнее замыкание хранит только слабую ссылку на
self, и цикл разрывается. Если же self нужен и внешнему, и внутреннему долгоживущему замыканию, слабый захват может понадобиться на обоих уровнях. А если сильный захват действительно безопасен, например внутри короткоживущего Task, его теперь можно просто указать явно через [self].Swift не вводит очередное правило владения памятью. Он просто начинает предупреждать о том, что язык и раньше делал неявно, но что было очень легко пропустить глазами. Начиная со Swift 6.4 компилятор хотя бы начнёт смотреть на это вместе с нами
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥3
⚡️Презентация Apple уже сегодня
В 20:00 ждём новые складные и обычные iPhone, iPad и Apple Watch
Ссылки на трансляцию:
🎞 YouTube
🍏 Сайт Apple
И, как обычно, под этим постом буду писать первые впечатления во время презентации и приглашаю вас присоединиться к обсуждению. Давно всё-таки не было чего-то по-настоящему нового🥳
В 20:00 ждём новые складные и обычные iPhone, iPad и Apple Watch
Ссылки на трансляцию:
И, как обычно, под этим постом буду писать первые впечатления во время презентации и приглашаю вас присоединиться к обсуждению. Давно всё-таки не было чего-то по-настоящему нового
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
📱Начали с iPhone 18 Pro and iPhone 18 Pro Max:
🎧 AirPods 5
⌚️Apple Watch Series 12 и Apple Watch Ultra 4
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🤔4👍1
📱 Подготовьте свои приложения для iPhone Duo
Apple выпустила целый раздел для разработчиков по адаптации приложений для iPhone Duo, давайте разбиарться! Начнем с
🟡 Приложения будут работать криво в режиме совместимости как iPhone приложения на iPad
🟡 Если собрать с iOS 27 SDK то будет уже фулскрин в режиме совместимости (черный статус-бар)
🟡 При сборке с iOS 27.1 SDK можно сделать пополноценную поддержку
🟡 Apple предлагает ориентироваться на доступное пространство через size classes. Для SwiftUI используется .enviroment
🟡 На внешнем экране Duo всё выглядит примерно как на обычном iPhone.
🟡 На внутреннем экране имеет
🟡 Внутренний экран вообще не обязан соблюдать ваши
🟡 У Duo два дисплея, поэтому понятие
🟡 Если реально нужен экран конкретного окна, получаем его через
🟡 Лучше вообще работать через environment, traits и размеры самой scene.
🟡 Ещё одна ловушка — safe area теперь может быть асимметричной
🟡 Если вы используете стандартную навигацию, большая часть адаптации приезжает бесплатно.
🟡 На внутреннем экране даже можно автоматически превращать tab bar в sidebar.
🟡 А в iOS 27.1 появилась ещё одна интересная штука:
🟡 В Xcode 27.1 через Device Hub можно симулировать разные состояния Duo: открыть, закрыть, повернуть, сложить и посмотреть, как ваш layout переживает всё это
🟡 Появился новый AI скил для адаптации новых практик
Главный вывод после просмотра довольно приятный: iPhone Duo не приносит какой-то отдельный "FoldableKit". Apple просто продолжает давить в сторону адаптивного интерфейса:
🟢 не угадывать устройство
🟢 не ориентироваться на конкретную ширину
🟢 не считать, что экран один
🟢 не предполагать симметричные safe areas
Если вы уже следовали этим правилам, у вас будет минимум работы по адаптации
Apple выпустила целый раздел для разработчиков по адаптации приложений для iPhone Duo, давайте разбиарться! Начнем с
regular size class сразу по горизонтали и вертикали и спокойно помещает sidebarsupportedInterfaceOrientations.UIScreen.main становится неоднозначным. Apple прямо говорит, что такие обращения будут deprecatedUIWindowScene:window?.windowScene?.screenwidth - leftInset * 2 больше не гарантирует правильный результат Левый и правый inset могут отличаться из-за формы устройства, камеры и системного UI. Apple советует считать каждую сторону отдельно и держать весь интерактивный UI внутри safe area, а фон уже спокойно растягивать edge-to-edge.NavigationSplitView, UISplitViewController, TabView, UITabBarController, sheets, popovers и alerts уже умеют адаптироваться к разным положениям DuoReservedRegion в SwiftUI и UIViewReservedRegion в UIKit. Она нужна кастомному edge-to-edge UI, чтобы сказать системе: дай мне максимум пространства, но не залезай туда, где уже живёт системный интерфейс.Главный вывод после просмотра довольно приятный: iPhone Duo не приносит какой-то отдельный "FoldableKit". Apple просто продолжает давить в сторону адаптивного интерфейса:
Если вы уже следовали этим правилам, у вас будет минимум работы по адаптации
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1