OGeek|极客世界-中国程序员成长平台

标题: ios - Swift 生成的 header 缺少外部 swift 框架 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 13:44
标题: ios - Swift 生成的 header 缺少外部 swift 框架

我在使用 Swift 生成的 header 时遇到了一些问题。我在 Swift 生成的 header 中的 Swift 类不包括来自通过 Cocoapods 安装的任何 Swift 框架的任何属性或方法。

这就是我正在做的事情。

  1. 我有一个纯 Objective-C 的 XCode 项目。

  2. 我在项目中添加了一个 Swift 类 (Model.swift),用于处理我的网络调用并将 JSON 响应同步到 CoreData。那个 Swift 类正在使用 Alamofire 进行所有的网络调用。

  3. 我设置了 XCode build设置以正确生成我的 ProjectName-Swift.h

  4. 当我在 Swift 生成的 header 中查看我的 Model.swift 类时,缺少函数调用。缺少的函数调用返回来自 Alamofire 的请求对象。所以看起来当 Xcode build 的 Swift header 时,它是看不到 Alamofire 的。

这是我检查过的一些事情。

  1. 我的 Model.swift 是公开的。类被标记为公开,我想要公开的功能是公开的。生成的 Swift header 将包含任何标记为公开的内容。
  2. 我从 Pods build设置中检查了 Alamofire,框架是公共(public)的,并且 Define Modules 设置为 YES。它还有自己生成的“Alamofire-Swift.h”。

我正在运行 XCode 7.2,最低部署目标为 iOS 8

我正在使用 cocoapods 0.39

这是我的 Cocoapods 示例。

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0' 
use_frameworks!
pod 'Alamofire', '3.1.2'

为了让 Swift header 从外部 Swift 框架生成代码,我还有什么遗漏吗?

我的下一步将是创建一个较小的项目进行测试。但是,如果这是不可能的,或者我错过了一些我想知道的东西。

谢谢大家

更新 - 我刚刚在 Objective-C 中创建了一个较小的 Xcode 项目,因此您可以看到我的 Model.swift 的缩小测试版本和生成的 header 。

import Foundation
import Alamofire

public class Model: NSObject
{
    public var myPropertyA: String?
    public var myPropertyB: Int = 0

    public override init()
    {
        super.init()
    }

    deinit
    {

    }

    //MARK: public methods

    public func myPublicFunctionA() -> String?
    {
        return nil
    }

    public func myPublicFunctionB() -> Int
    {
        return 0
    }

    public func simpleRequest() -> Request?
    {
        return nil
    }

    public func requestJSON(method: Alamofire.Method, url: String?, parameters: [String: AnyObject]?, headers: [String: String]?, complete: ((json: AnyObject?, error: NSError?, errorOccurred: Bool) -> Void)?) -> Request?
    {
        var request: Request?
        request = Alamofire.request(method, url!, parameters: parameters, encoding: .URL, headers: headers).validate().responseJSON { response in

            let json: AnyObject? = response.result.value

            switch response.result
            {
            case .Success:

                if (complete != nil)
                {
                    complete?(json: json, error: nil, errorOccurred: false)
                }

                break

            case .Failure(let error):

                if (complete != nil)
                {
                    complete?(json: json, error: error, errorOccurred: true)
                }

                break
            }
        }

        return request
    }
}

这是从 Xcode 生成的 swift header 。如果滚动到底部,您将看到生成的 Model.swift 将缺少 2 个需要 Alamofire 依赖的函数。缺少 simpleRequest 和 requestJSON。

// Generated by Apple Swift version 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81)
#pragma clang diagnostic push

#if defined(__has_include) && __has_include(<swift/objc-prologue.h>)
# include <swift/objc-prologue.h>
#endif

#pragma clang diagnostic ignored "-Wauto-import"
#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif !defined(__cplusplus) || __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif

typedef struct _NSZone NSZone;

#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if defined(__has_attribute) && __has_attribute(swift_name)
# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
#else
# define SWIFT_COMPILE_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_ENUM_EXTRA)
# define SWIFT_ENUM_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted) 
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#if !defined(SWIFT_ENUM)
# define SWIFT_ENUM(_type, _name) enum _name : _type _name; enum SWIFT_ENUM_EXTRA _name : _type
#endif
typedef float swift_float2  __attribute__((__ext_vector_type__(2)));
typedef float swift_float3  __attribute__((__ext_vector_type__(3)));
typedef float swift_float4  __attribute__((__ext_vector_type__(4)));
typedef double swift_double2  __attribute__((__ext_vector_type__(2)));
typedef double swift_double3  __attribute__((__ext_vector_type__(3)));
typedef double swift_double4  __attribute__((__ext_vector_type__(4)));
typedef int swift_int2  __attribute__((__ext_vector_type__(2)));
typedef int swift_int3  __attribute__((__ext_vector_type__(3)));
typedef int swift_int4  __attribute__((__ext_vector_type__(4)));
#if defined(__has_feature) && __has_feature(modules)
@import ObjectiveC;
#endif

#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#pragma clang diagnostic ignored "-Wduplicate-method-arg"

SWIFT_CLASS("_TtC6MyTest5Model")
@interface Model : NSObject
@property (nonatomic, copy) NSString * __nullable myPropertyA;
@property (nonatomic) NSInteger myPropertyB;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (NSString * __nullable)myPublicFunctionA;
- (NSInteger)myPublicFunctionB;
@end

#pragma clang diagnostic pop



Best Answer-推荐答案


我遇到了同样的问题,解决它的方法是在公共(public)函数之前添加指令 @objc 以在 Objective C 中使用。

例如:

import Foundation
import Alamofire

public class Model: NSObject
{
    public var myPropertyA: String?
    public var myPropertyB: Int = 0

public override init()
{
    super.init()
}

deinit
{

}

//MARK: public methods

@objc public func myPublicFunctionA() -> String?
{
    return nil
}

@objc public func myPublicFunctionB() -> Int
{
    return 0
}

@objc public func simpleRequest() -> Request?
{
    return nil
}

...

希望能帮到你。

关于ios - Swift 生成的 header 缺少外部 swift 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34978713/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) Powered by Discuz! X3.4