【发布时间】:2016-09-07 15:45:26
【问题描述】:
我有一个将Objective-C 和Swift 混合在一起的框架。它单独编译,但是当我在Objective-C iOS 应用程序中导入它时,找不到Swift 类,但找到了Objective-C 类。
导入 MyFramework-Swift.h 时在框架内找到我的 Swift 类
iOS 应用和框架是同一个工作区中的两个不同项目。
Defines Module 和 Embedded content contains Swift Code 对于所有目标都设置为 Yes,我的 Swift 类是公开的 @objc
我尝试使用@import MyFramework 和#import <MyFramework/MyFramework-Swift.h>,但没有成功。
我没有在项目的框架的 Headers 目录中看到 MyFramework-Swift.h 头文件。不确定这是否正常。生成于DerivedData
编辑:我设法在 Xcode 8 中用一个非常简单的工作区重现了这个问题(但在 7.3 中可能相同):
- 在Objective-C中创建一个新的Cocoa touch框架
TestFramework -
创建一个
A.h文件@class B; @interface A : NSObject -(void)print:(B*)caller; @end -
创建一个
A.m文件#import <Foundation/Foundation.h> #import "TestFramework-Swift.h" #import "A.h" @implementation A -(void)print:(B*)caller { [caller test]; } -
创建一个
B.swift文件import Foundation @objc public class B : NSObject { public func test() { print("test"); } } 将
A.h设置为公共标头- 将
A.h导入TestFramework.h - 尝试编译框架
这里没有找到TestFramework-Swift.h
- 将
Install Objective-C compatibility header设置为No - 尝试编译框架
现在可以编译了!
- 新建 iOS Objective-C 单视图应用 App
-
像这样更新 ViewController.m
#import "ViewController.h" @import TestFramework; @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; B* b = [[B alloc] init]; A* a = [[A alloc] init]; [a print: b]; } [...] @end
B 上应该有错误,但 A 上没有。我还在两个项目中都将 Defines Module 设置为 Yes,但均未成功
【问题讨论】:
-
几个问题:1)框架和Objective-C代码实际上是不同的项目,还是同一个项目中的不同目标?听起来他们在不同的项目中,但想仔细检查。 2) 什么样的 Objective-C 代码使用该框架?它是命令行实用程序吗?可可应用程序?图书馆?
-
1) 它们是同一工作区中的不同项目。 2)这是一个iOS应用问题更新
标签: ios objective-c swift xcode