У меня возникли проблемы с привязкой моей структуры к коду, который использует эту инфраструктуру. В частности, компоновщик не может найти символы для расширений для генерических структур.
Это то, что одно из расширений выглядит как Необязательно:
extension Optional {
/// Unwrap the value returning 'defaultValue' if the value is currently nil
func or(defaultValue: T) -> T {
switch(self) {
case .None:
return defaultValue
case .Some(let value):
return value
}
}
}
Этот метод отлично работает на игровой площадке или в приложении, если код скомпилирован в основной части приложения. Однако, когда я пытаюсь скомпилировать это в Framework, приложения (и даже тесты для фреймворка) создают следующую ошибку компоновщика:
Undefined символы для архитектуры i386: "__TFSq2orU__fGSqQ__FQQ", ссылка: __TFC18SwiftPlusPlusTests27Optional_SwiftPlusPlusTests13testOrWithNilfS0_FT_T_ в необязательном + SwiftPlusPlusTests.o
Аналогичные методы, подобные приведенным ниже, связаны штрафом (обратите внимание, что он не является общим)
extension String {
/// Returns a string by repeating it 'times' times
func repeat(times: Int) -> String {
var result = ""
for i in 0..times {
result += self
}
return result
}
}
В моем репозитории github есть два других расширения: SwiftPlusPlus, которые также не связаны (как с общими строками). Вы будете воспроизводить ошибки, если вы вытащите последнюю фиксацию, создайте фреймворк и затем попытайтесь выполнить модульные тесты.
До сих пор я пытался запускать "строки" в выводимых фреймворках и промежуточных файлах, и я не вижу символов для этих расширений, но я вижу символы для расширения метода repeat
на String
. Таким образом, он даже не компилирует их в библиотеку.
Кто-нибудь знает, почему символы не определены в рамках?
Edit