我在使用 Swift 生成的 header 时遇到了一些问题。我在 Swift 生成的 header 中的 Swift 类不包括来自通过 Cocoapods 安装的任何 Swift 框架的任何属性或方法。
这就是我正在做的事情。
我有一个纯 Objective-C 的 XCode 项目。
我在项目中添加了一个 Swift 类 (Model.swift),用于处理我的网络调用并将 JSON 响应同步到 CoreData。那个 Swift 类正在使用 Alamofire 进行所有的网络调用。
我设置了 XCode build设置以正确生成我的 ProjectName-Swift.h
当我在 Swift 生成的 header 中查看我的 Model.swift 类时,缺少函数调用。缺少的函数调用返回来自 Alamofire 的请求对象。所以看起来当 Xcode build 的 Swift header 时,它是看不到 Alamofire 的。
这是我检查过的一些事情。
我正在运行 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
我遇到了同样的问题,解决它的方法是在公共(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|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |