dnn*_*agy 251 objective-c ios swift
我尝试Swift
在我的app中集成代码.我的应用程序是写入的Objective-C
,我添加了一个Swift
类.我做了这里描述的所有事情.但我的问题是Xcode
没有创建-Swift.h
文件,只有桥接头.所以我创造了它,但它实际上是空的.我可以在Swift中使用我所有的ObjC类,但我不能这样做.我标记了我的快速课程,@objc
但没有帮助.我现在能做什么?
编辑:Apple说:"当您将Swift代码导入Objective-C时,您依靠Xcode-generated
头文件将这些文件暴露给Objective-C.[...]此标题的名称是您的产品模块名称,然后添加" -Swift.h"."
现在,当我想导入该文件时,它会出错:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Run Code Online (Sandbox Code Playgroud)
这是我的FBManager.swift文件:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
Run Code Online (Sandbox Code Playgroud)
sig*_*sig 507
我花了大约4个小时试图Swift
在我Xcode
的基于Objective-C的项目中启用.我的" myproject-Swift.h
"文件已成功创建,但我Xcode
没有看到我的文件Swift-classes
.所以,我决定创建一个新Xcode
的基于Objc的项目,最后我找到了正确的答案!希望这篇文章能帮助某人:-)
*.swift
文件(在Xcode中)或使用Finder添加它Objective-C bridging header
Xcode问你这个问题实现你的Swift类:
import Foundation
// use @objc or @objcMembers annotation if necessary
class Foo {
//..
}
Run Code Online (Sandbox Code Playgroud)打开构建设置并检查这些参数:
YES
在搜索栏中复制并粘贴参数名称
myproject
确保您的产品模块名称不包含任何特殊字符
YES
将
*.swift
文件添加到项目后,此属性将显示在"构建设置"中
myproject-Swift.h
此标头由Xcode自动生成
$(SRCROOT)/myproject-Bridging-Header.h
在*.m文件中导入Swift接口标头
#import "myproject-Swift.h"
Run Code Online (Sandbox Code Playgroud)
不要注意错误和警告.
Bil*_*ill 64
不要自己创建头文件.删除您创建的那个.
确保您的Swift类标记@objc
或继承自(直接或间接)派生的类NSObject
.
如果项目中有任何编译器错误,Xcode将不会生成文件 - 确保您的项目构建完整.
Bha*_*odi 37
允许Xcode完成其工作,不要手动添加/创建Swift标头.只需在Swift类之前添加@objc.
@objc class YourSwiftClassName: UIViewController
Run Code Online (Sandbox Code Playgroud)
在您的项目设置中搜索以下标志并将其更改为YES(项目和目标)
Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES
Run Code Online (Sandbox Code Playgroud)
然后清理项目并构建一次,在构建成功之后(它应该可能)导入到objective-c类.m文件中的头文件下面
#import "YourProjectName-Swift.h"
Run Code Online (Sandbox Code Playgroud)
Boooom!
Jee*_*hut 28
对于那些拥有Framework目标的人来说,这也许有帮助:
自动生成的头文件的import语句与app目标略有不同.除了在其他答案中提到的其他事项使用
#import <ProductName/ProductModuleName-Swift.h>
Run Code Online (Sandbox Code Playgroud)
代替
#import "ProductModuleName-Swift.h"
Run Code Online (Sandbox Code Playgroud)
根据关于框架目标的Mix&Match的 Apples文档.
Vas*_*huk 13
详细信息:使用Xcode 8.1中的Swift 3代码进行Objective-C项目
任务:
ObjcClass.h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, ObjcEnum) {
ObjcEnumValue1,
ObjcEnumValue2,
ObjcEnumValue3
};
@interface ObjcClass : NSObject
+ (void) PrintEnumValues;
@end
Run Code Online (Sandbox Code Playgroud)
ObjcClass.m
#import "ObjcClass.h"
#import "SwiftCode.h"
@implementation ObjcClass
+ (void) PrintEnumValues {
[self PrintEnumValue:SwiftEnumValue1];
[self PrintEnumValue:SwiftEnumValue2];
[self PrintEnumValue:SwiftEnumValue3];
}
+ (void) PrintEnumValue:(SwiftEnum) value {
switch (value) {
case SwiftEnumValue1:
NSLog(@"-- SwiftEnum: SwiftEnumValue1");
break;
case SwiftEnumValue2:
case SwiftEnumValue3:
NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
break;
}
}
@end
Run Code Online (Sandbox Code Playgroud)
在我的示例中,我使用SwiftCode.h来检测Objective-C中的Swift代码.此文件自动生成(我没有在项目中创建此头文件的物理副本),并且您只能设置此文件的名称:
如果编译器找不到你的头文件Swift代码,请尝试编译项目.
import Foundation
@objc
enum SwiftEnum: Int {
case Value1, Value2, Value3
}
@objc
class SwiftClass: NSObject {
class func PrintEnumValues() {
PrintEnumValue(.Value1)
PrintEnumValue(.Value2)
PrintEnumValue(.Value3)
}
class func PrintEnumValue(value: ObjcEnum) {
switch value {
case .Value1, .Value2:
NSLog("-- ObjcEnum: int value = \(value.rawValue)")
case .Value3:
NSLog("-- ObjcEnum: Value3")
break
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要创建桥接头文件.当您在Objective-C项目中添加Swift文件,或者在swift项目中添加Objective-C文件时,Xcode会建议您创建桥接头.
您可以在此处更改桥接头文件名:
转职Header.h
#import "ObjcClass.h"
Run Code Online (Sandbox Code Playgroud)
#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];
Run Code Online (Sandbox Code Playgroud)
完整集成步骤Objective-c和Swift如上所述.现在我将编写一些其他代码示例.
斯威夫特班
import Foundation
@objc
class SwiftClass:NSObject {
private var _stringValue: String
var stringValue: String {
get {
print("SwiftClass get stringValue")
return _stringValue
}
set {
print("SwiftClass set stringValue = \(newValue)")
_stringValue = newValue
}
}
init (stringValue: String) {
print("SwiftClass init(String)")
_stringValue = stringValue
}
func printValue() {
print("SwiftClass printValue()")
print("stringValue = \(_stringValue)")
}
}
Run Code Online (Sandbox Code Playgroud)
Objective-C代码(调用代码)
SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";
Run Code Online (Sandbox Code Playgroud)
结果
Objective-C类(ObjcClass.h)
#import <Foundation/Foundation.h>
@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end
Run Code Online (Sandbox Code Playgroud)
ObjcClass.m
#import "ObjcClass.h"
@interface ObjcClass()
@property NSString* strValue;
@end
@implementation ObjcClass
- (instancetype) initWithStringValue:(NSString*)stringValue {
NSLog(@"ObjcClass initWithStringValue");
_strValue = stringValue;
return self;
}
- (void) printValue {
NSLog(@"ObjcClass printValue");
NSLog(@"stringValue = %@", _strValue);
}
- (NSString*) stringValue {
NSLog(@"ObjcClass get stringValue");
return _strValue;
}
- (void) setStringValue:(NSString*)newValue {
NSLog(@"ObjcClass set stringValue = %@", newValue);
_strValue = newValue;
}
@end
Run Code Online (Sandbox Code Playgroud)
Swift代码(调用代码)
if let obj = ObjcClass(stringValue: "Hello World!") {
obj.printValue()
let str = obj.stringValue;
obj.stringValue = "HeLLo wOrLd!!!";
}
Run Code Online (Sandbox Code Playgroud)
结果
迅捷扩展
extension UIView {
static func swiftExtensionFunc() {
NSLog("UIView swiftExtensionFunc")
}
}
Run Code Online (Sandbox Code Playgroud)
Objective-C代码(调用代码)
[UIView swiftExtensionFunc];
Run Code Online (Sandbox Code Playgroud)
Objective-C扩展(UIViewExtension.h)
#import <UIKit/UIKit.h>
@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end
Run Code Online (Sandbox Code Playgroud)
UIViewExtension.m
@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
NSLog(@"UIView objcExtensionFunc");
}
@end
Run Code Online (Sandbox Code Playgroud)
Swift代码(调用代码)
UIView.objcExtensionFunc()
Run Code Online (Sandbox Code Playgroud)
小智 11
我遇到了同样的问题,结果发现模块名称中的特殊符号被xcode取代(在我的情况下,破折号最后是下划线).在项目设置中,选中"模块名称"以查找项目的模块名称.之后,ModuleName-Swift.h
在设置中使用或重命名模块.
该文件是自动创建的(这里谈论Xcode 6.3.2).但是你不会看到它,因为它在你的Derived Data文件夹中.使用@objc
,编译后标记swift类,然后Swift.h
在Derived Data文件夹中搜索.你应该在那里找到Swift标头.
我有问题,Xcode重命名my-Project-Swift.h
为my_Project-Swift.h
Xcode不喜欢
"." "-"
等符号.使用上面的方法,您可以找到文件名并将其导入Objective-C类.
只需在.m或.h文件中包含#import"myProject-Swift.h"即可
PS你不会在文件检查器中找到隐藏的"myProject-Swift.h".但它是由app自动生成的.
对于 Swift 5:
@objc
关键字添加到您的类和方法中public
关键字添加到您的类和方法NSObject
放入#import "MyProject-Swift.h"
你的 Objective-C 文件
@objc
public class MyClass: NSObject {
@objc
public func myMethod() {
}
}
Run Code Online (Sandbox Code Playgroud)@sig 答案是最好的答案之一,但是,它不适用于我的旧项目(不是新项目!),我需要进行一些修改。经过很多变化后,我找到了适合我的食谱(使用 XCode 7.2):
最后一点 (5) 至关重要。我只把它放在第二部分(目标字段),项目字段应该留空: 否则,它不会为我生成正确的“Project-Swift.h”文件(它不包含 swift 方法)。
有两个条件,
因此,为此,您必须执行以下步骤:
转到“ 构建设置”,然后执行以下搜索步骤,
之后,清理并重建您的项目。
在这种情况下,请先在班级前的swift文件中输入“ @objc”。
之后,在您的目标c文件中,编写此代码,
#import "YourProjectName-Swift.h"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,请在您的头文件中编写此代码,
#import "YourObjective-c_FileName.h"
Run Code Online (Sandbox Code Playgroud)
我希望这能帮到您。
归档时间: |
|
查看次数: |
146889 次 |
最近记录: |