ios - Swift 生成的 header 缺少外部 swift 框架
<p><p>我在使用 Swift 生成的 header 时遇到了一些问题。我在 Swift 生成的 header 中的 Swift 类不包括来自通过 Cocoapods 安装的任何 Swift 框架的任何属性或方法。</p>
<p>这就是我正在做的事情。</p>
<ol>
<li><p>我有一个纯 Objective-C 的 XCode 项目。 </p></li>
<li><p>我在项目中添加了一个 Swift 类 (Model.swift),用于处理我的网络调用并将 JSON 响应同步到 CoreData。那个 Swift 类正在使用 Alamofire 进行所有的网络调用。</p></li>
<li><p>我设置了 XCode build设置以正确生成我的 ProjectName-Swift.h</p>
<ul>
<li>定义模块是</li>
<li>添加产品模块名称</li>
</ul></li>
<li><p>当我在 Swift 生成的 header 中查看我的 Model.swift 类时,缺少函数调用。缺少的函数调用返回来自 Alamofire 的请求对象。所以看起来当 Xcode build 的 Swift header 时,它是看不到 Alamofire 的。</p></li>
</ol>
<p>这是我检查过的一些事情。</p>
<ol>
<li>我的 Model.swift 是公开的。类被标记为公开,我想要公开的功能是公开的。生成的 Swiftheader 将包含任何标记为公开的内容。</li>
<li>我从 Pods build设置中检查了 Alamofire,框架是公共(public)的,并且 Define Modules 设置为 YES。它还有自己生成的“Alamofire-Swift.h”。</li>
</ol>
<p>我正在运行 XCode 7.2,最低部署目标为 iOS 8</p>
<p>我正在使用 cocoapods 0.39</p>
<p>这是我的 Cocoapods 示例。</p>
<pre><code>source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'Alamofire', '3.1.2'
</code></pre>
<p>为了让 Swiftheader 从外部 Swift 框架生成代码,我还有什么遗漏吗?</p>
<p>我的下一步将是创建一个较小的项目进行测试。但是,如果这是不可能的,或者我错过了一些我想知道的东西。</p>
<p>谢谢大家</p>
<p>更新 - 我刚刚在 Objective-C 中创建了一个较小的 Xcode 项目,因此您可以看到我的 Model.swift 的缩小测试版本和生成的 header 。</p>
<pre><code>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: ?, headers: ?, 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
}
}
</code></pre>
<p>这是从 Xcode 生成的 swiftheader 。如果滚动到底部,您将看到生成的 Model.swift 将缺少 2 个需要 Alamofire 依赖的函数。缺少 simpleRequest 和 requestJSON。</p>
<pre><code>// 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
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>我遇到了同样的问题,解决它的方法是在公共(public)函数之前添加指令 <strong>@objc</strong> 以在 Objective C 中使用。</p>
<p>例如:</p>
<pre><code>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
}
</code></pre>
<p>...</p>
<p>希望能帮到你。</p></p>
<p style="font-size: 20px;">关于ios - Swift 生成的 header 缺少外部 swift 框架,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/34978713/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/34978713/
</a>
</p>
页:
[1]