gpt4 book ai didi

ios - Xcode 将 Swift Framework 导入 Objective C 应用程序时出现类型解析问题

转载 作者:行者123 更新时间:2023-11-30 11:23:15 24 4
gpt4 key购买 nike

将 Swift 框架导入 Objective-C 项目时,我遇到了一个非常奇怪的问题。该项目无法构建。我收到一个解析问题,其中包含源自 Xcode 生成的 MyFramework-Swift-h 文件的消息“预期类型”。该警告专门针对接受类型化数组作为其单个参数的方法的签名。

swift 方法如下所示:

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

编译后,它看起来像这样:

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

解析问题提示 NSArray 类型,它似乎不理解。非常奇怪的是,我发现了一个可怕的黑客修复,从长远来看实际上并没有帮助。在 MyFramework-Swift-h 文件中,顶部有一个 block :

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

如果我手动添加 @import UIKit,Objective C 项目现在将进行编译。但是我无法弄清楚 XCode 如何确定自动导入的内容。我的框架在很多地方导入了 UIKit,所以它没有导入似乎很奇怪。我也不知道为什么手动导入它有助于找到 NSArray 类型!

最佳答案

NSArray 是 Foundation 集合对象,而不是 UIKit。 UIKit 通过其他 header (NSDataAsset.h) 包含 Foundation,因此您将看到 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

必须用于告诉 header 您想要定义 NS* 对象。

您的框架可以在多个位置包含 UIKit,但自动生成的 header 可能没有其中定义的方法(函数缺少 @objc 等)。因此,导入语句可能会被传递出去。

关于ios - Xcode 将 Swift Framework 导入 Objective C 应用程序时出现类型解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51060775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com