встроенный модуль не имеет члена с именем convertUnownedUnsafeToGuaranteed

#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, а?)

https://forums.swift.org/t/error-abort-trap-6-when-compiling-using-xcode-12-beta-12a6159-with-swift-5-2-4-release-toolchain/37942

Набор инструментов 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) и т.д.