菜鸟教程小白 发表于 2022-12-13 13:44:48

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 &#39;https://github.com/CocoaPods/Specs.git&#39;
platform :ios, &#39;8.0&#39;
use_frameworks!
pod &#39;Alamofire&#39;, &#39;3.1.2&#39;
</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() -&gt; String?
    {
      return nil
    }

    public func myPublicFunctionB() -&gt; Int
    {
      return 0
    }

    public func simpleRequest() -&gt; Request?
    {
      return nil
    }

    public func requestJSON(method: Alamofire.Method, url: String?, parameters: ?, headers: ?, complete: ((json: AnyObject?, error: NSError?, errorOccurred: Bool) -&gt; Void)?) -&gt; 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) &amp;&amp; __has_include(&lt;swift/objc-prologue.h&gt;)
# include &lt;swift/objc-prologue.h&gt;
#endif

#pragma clang diagnostic ignored &#34;-Wauto-import&#34;
#include &lt;objc/NSObject.h&gt;
#include &lt;stdint.h&gt;
#include &lt;stddef.h&gt;
#include &lt;stdbool.h&gt;

#if defined(__has_include) &amp;&amp; __has_include(&lt;uchar.h&gt;)
# include &lt;uchar.h&gt;
#elif !defined(__cplusplus) || __cplusplus &lt; 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) &amp;&amp; __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) &amp;&amp; __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) &amp;&amp; __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) &amp;&amp; __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) &amp;&amp; __has_feature(modules)
@import ObjectiveC;
#endif

#pragma clang diagnostic ignored &#34;-Wproperty-attribute-mismatch&#34;
#pragma clang diagnostic ignored &#34;-Wduplicate-method-arg&#34;

SWIFT_CLASS(&#34;_TtC6MyTest5Model&#34;)
@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() -&gt; String?
{
    return nil
}

@objc public func myPublicFunctionB() -&gt; Int
{
    return 0
}

@objc public func simpleRequest() -&gt; 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]
查看完整版本: ios - Swift 生成的 header 缺少外部 swift 框架