Xcode Ожидается проблема разбора типа при импорте Swift Framework в приложение Objective C - PullRequest
0 голосов
/ 27 июня 2018

У меня очень странная проблема при импорте Swift Framework в проект target-c. Проект не удается построить. Я получаю сообщение Parse Issue с ​​сообщением «Ожидаемый тип», исходящим из файла MyFramework-Swift-h, который генерирует Xcode. Предупреждение относится именно к сигнатуре для метода, который принимает типизированный массив в качестве единственного параметра.

Быстрый метод выглядит следующим образом:

@objc public func set(paymentMethods: [PaymentMethod]) -> ParamsBuilder {
    params.paymentMethods = paymentMethods
    return self
}

И после компиляции это выглядит так:

- (ParamsBuilder * _Nonnull)setWithPaymentMethods:(NSArray<PaymentMethod *> * _Nonnull)paymentMethods SWIFT_WARN_UNUSED_RESULT;

Проблема Parse жалуется на тип NSArray, который, похоже, не понимает. Очень странно, что я нашел ужасное исправление, которое на самом деле не помогает в долгосрочной перспективе. В файле MyFramework-Swift-h вверху находится блок:

#if __has_feature(modules)
@import ObjectiveC;
#endif

Если я вручную добавлю @import UIKit, проект Objective C теперь скомпилируется. Однако я не могу понять, как XCode определяет, что автоматически импортировать. My Framework импортирует UIKit во многих местах, поэтому странно, что он не импортируется. Я также понятия не имею, почему импорт вручную помогает найти тип NSArray!

1 Ответ

0 голосов
/ 28 июня 2018

NSArray - это объект коллекции Foundation, а не UIKit. UIKit включает в себя Foundation через другие заголовки (NSDataAsset.h), поэтому вы видите результат распознавания NSArray.

Например, это из заголовочного файла AudioKit для совместимости Swift - ObjectiveC:

//
//  AudioKit.h
//  AudioKit
//
//  Created by Aurelius Prochazka, revision history on Github.
//  Copyright © 2018 AudioKit. All rights reserved.
//
#pragma once

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#if !TARGET_OS_TV
#import <CoreAudioKit/CoreAudioKit.h>
#endif

Похоже, что ваш сгенерированный заголовочный файл может не иметь представления о том, что происходит, так как импорт отсутствует, вам нужно сообщить ему, что нужно. Возможно, вы удалили строку случайно или файлы заголовков были созданы без нее. Итак, либо

#import <Foundation/Foundation.h>

или

import Foundation

должен использоваться, чтобы указать заголовку, что вы хотите определить NS * объекты.

Ваш фреймворк может включать UIKit в нескольких местах, однако автоматически сгенерированный заголовок может не иметь определенных в нем методов (в функциях отсутствует @objc и т. Д.). Таким образом, оператор импорта может быть передан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...