我最近在swift中被迫使用了一些Objective-c语言类,我搜索并找到了Apple doc:
将Objective-C代码从同一目标导入Swift
1)在Objective-C桥接头文件中,导入每个Objective-C 你希望暴露给Swift的标题。例如:
#import "XYZCustomCell.h" #import "XYZCustomView.h" #import "XYZCustomViewController.h"
2)在构建设置中,在Swift编译器 - 代码生成中,确保Objective-C桥接头 构建设置下有一个桥接头文件的路径。路径 应该与您的项目相关,类似于Info.plist的方式 path在Build Settings中指定。在大多数情况下,你不应该 需要修改此设置。
中列出的任何公共Objective-C标头 这个桥接头文件将对Swift可见。 Objective-C 功能将在该目标中的任何Swift文件中可用 自动,没有任何import语句。使用您的自定义 Objective-C代码与您在系统中使用的Swift语法相同 类。
我按照步骤将初始代码添加到我的swift类中:
let percentageView: FSPercentageView = FSPercentageView(frame: CGRectMake(15, 65, 300, 300))
但是我收到了一条错误消息:用于未申报的类型' FSPercentageView'。
我在swift中搜索过使用objective-c相关的错误,但我没有找到任何有用的答案。 我检查了桥头文件路径,看起来没问题。
我希望你的建议能解决我的问题。
更新
My Bridging-Header.h
#import "FSPercentageView.h"
我的FSPercentageView.h类:
#import <Foundation/Foundation.h>
#import "MCCore.h"
@class FCPercentageView;
typedef enum {
FSPercentageViewTextStyleAutomaticShowsPercentage,
FSPercentageViewTextStyleUserDefined
} FSPercentageViewTextStyle;
@interface FSPercentageView : MCNewCustomLayeredView
/*
Sets the percentage of the view.
*/
@property (nonatomic) CGFloat percentage;
/*
Sets the percentage of the view.
*/
@property (nonatomic) CGFloat initialPercentage;
/*
Defines the border percentage for both filled and unfilled portions.
*/
@property (nonatomic) CGFloat borderPercentage;
/*
The label of the text in the center of the doughnut.
*/
@property (nonatomic, retain) UILabel *textLabel;
/*
The color for the filled portion of the doughnut.
*/
@property (nonatomic, retain) UIColor *fillColor;
/*
The color for the unfilled portion of the doughnut.
*/
@property (nonatomic, retain) UIColor *unfillColor;
}
和FSPercentageView.m的初始段:
#import "FSPercentageView.h"
#import "FSNewCustomLayeredView+FSCustomLayeredViewSubclass.h"
typedef enum {
FSPercentageViewStateNormal,
FSPercentageViewStatePushed
} FSPercentageViewTouchState;
@interface FSPercentageView()
@property (nonatomic, retain) UIView *centerView;
@property (nonatomic) FSPercentageViewTouchState touchState;
@end
@implementation FSPercentageView
- (void)setDefaults
{
[super setDefaults];
self.linePercentage = 0.15;
self.borderPercentage = 0;
self.showTextLabel = YES;
self.animationDuration = 0.5;
self.unfillColor = [MCUtil iOS7DefaultGrayColorForBackground];
self.borderColorForFilledArc = [UIColor blackColor];
self.borderColorForUnfilledArc = [UIColor clearColor];
self.borderPercentageForFilledArc = -1;
self.borderPercentageForUnfilledArc = -1;
self.adjustsFontSizeAutomatically = YES;
self.roundedImageOverlapPercentage = 0;
self.touchState = FSPercentageViewStateNormal;
self.gradientColor1 = [MCUtil iOS7DefaultBlueColor];
self.gradientColor2 = [MCUtil iOS7DefaultGrayColorForBackground];
_percentage = 0.0;
_initialPercentage = 0.0;
_centerView = [[UIView alloc] init];
_textLabel = [[UILabel alloc] init];
}
- (void)willDrawSublayers
{
if (!self.fillColor) {
self.fillColor = self.tintColor;
}
}
- (Class)classForSublayers {
return [MCSliceLayer class];
}
和快速代码:
let percentageView: FSPercentageView = FSPercentageView(frame: CGRectMake(15, 35, 289, 311))
显示上一行中的错误。
答案 0 :(得分:1)
我希望你的建议能解决我的问题。
但您没有提供任何信息,因此无法提出任何建议。 Apple说的是真的;我向您保证,此功能确实有效。问题只能在于您没有按照自己引用的说明进行操作。
答案 1 :(得分:0)
我发现了我的代码存在的问题。
我的应用程序中有两个目标,而且我正在使用测试单元。 由于在所有提到的目标中添加了我的swift代码,因此项目需要有3个与每个目标相关的桥接类,并且必须在所有目标中导入标题。实际上红色消息是关于单元测试桥接文件。
现在,我从测试单元中删除了我的swift类,代码正在编译并运行,没有任何问题。