#ios #xcode
#iOS #xcode
Вопрос:
Вчера мой Mac решил автоматически обновить Xcode 11 до 12, но, упс, мне все еще нужен Xcode 11. Итак, я установил 11.7 непосредственно из https://developer.apple.com/download/more / .
Теперь все мои проекты не могут быть построены с ошибкой module 'Builtin' has no member named convertUnownedUnsafeToGuaranteed
. Это всегда происходит при компиляции какой-либо платформы (например, Alamofire), но в каждом проекте это разные рамки. Все проекты настроены на использование Swift 5.
Я переустановил инструменты командной строки Xcode 12, которые не помогли. Я попытался установить инструменты командной строки Xcode 11, но установщик сообщает мне, что моя ОС слишком новая (я на Big Sur 20A5374g).
xcode-переключение с одного на другой не помогает. Также не выполняется очистка / удаление папок сборки проекта.
Google говорит, что я единственный человек, столкнувшийся с этим. Кто-нибудь еще? Идеи?
Комментарии:
1. Это не так. Я тоже это понимаю, и я все еще на Каталине. (Так что я, скорее всего, смогу переустановить Xcode 11 и вернуться к работе.)
2. Полезно знать. Вы установили 11.7 со страницы загрузок или это была установка из App Store?
3. Загрузки. И это сработало. Во всяком случае, не решение, а решение.
4. Я повторно загрузил 11.7 из загрузок и столкнулся с той же проблемой. Затем я скачал 11.6, и это решило проблему.
Ответ №1:
Я не до конца понимаю внутреннюю проблему, возникающую при возникновении этой ошибки, но я нашел способ ее решения в моей локальной системе. (Mojave, Xcode 11.7) Моя конкретная проблема заключалась в том, что я вставил iOS 14 SDK вместо iOS 13 SDK Xcode 11.7, с которым изначально поставлялся. У меня возникли проблемы только при попытке создать какой-либо быстрый код. (чего я лично стараюсь избегать, как чумы)
В итоге я написал скрипт, который переключается между моими папками iOS 14 и iOS 13 SDK, чтобы временно «решить» проблему, но из дальнейшего расследования выясняется, что я все время подозревал: необходимость в обновленной цепочке инструментов swift (так много для стабильности ABI, а?)
Набор инструментов swift, который поставляется с более новыми версиями Xcode, должен иметь эту функцию, добавленную к ‘builtin’ (как аналогично упомянуто по этой ссылке выше)
Я не пробовал устанавливать что-либо из набора инструментов swift 5.0, но я предполагаю, что попытка установить более новый потенциально обеспечит более правильное решение этой проблемы.
РЕДАКТИРОВАТЬ: при дальнейшем исследовании установка этих наборов инструментов не позволит вам выполнять сборку на устройстве, однако я нашел немного хитрое решение, если вы готовы испачкать руки (если это когда-нибудь повторится или случится с кем-либо еще)
если вы откроете следующий файл в текстовом редакторе (я сделал это в vim) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/swift/Swift.swiftmodule/arm64-apple-ios.swiftinterface
и выполните поиск ‘convertUnownedUnsafeToGuaranteed’, вы должны столкнуться с этой функцией:
@inlinable @_transparent public func _withUnsafeGuaranteedRef<Result>(_ body: (Instance) throws -> Result) rethrows -> Result {
var tmp = self
// Builtin.convertUnownedUnsafeToGuaranteed expects to have a base value
// that the 0 value depends on. In this case, we are assuming that is done
// for us opaquely already. So, the builtin will emit a mark_dependence on a
// trivial object. The optimizer knows to eliminate that so we do not have
// any overhead from this.
let fakeBase: Int? = nil
return try body(Builtin.convertUnownedUnsafeToGuaranteed(fakeBase,
amp;tmp._value))
}
вы можете прокомментировать это, используя стандартный /* */, а затем поместить это на свое место, и он / должен / получить эту ошибку.
@inlinable public func _withUnsafeGuaranteedRef<Result>(_ body: (Instance) throws -> Result) rethrows -> Result {
let (guaranteedInstance, token) = Builtin.unsafeGuaranteed(_value)
let result = try body(guaranteedInstance)
Builtin.unsafeGuaranteedEnd(token)
return result
}
Если вам интересно, где я нашел эту функцию, она находится внутри версии iOS 13.x SDK того же файла. находится по адресу: (если у вас где-либо установлен XCode с iOS 13 SDK) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/swift/Swift.swiftmodule/arm64.swiftinterface
Если вы хотите увидеть точный путь к iOS SDK, который вы создаете с помощью xcrun, это может быть чрезвычайно полезно:
xcrun --sdk iphoneos --show-sdk-path
выдает:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
Предположительно, вам нужно будет повторить эти шаги для любой другой архитектуры, на которую вы ориентируетесь (например, arm64e-apple-ios.swiftinterface) и т.д.