在Swift类中使用Objective-c类

时间:2015-10-09 19:14:37

标签: ios objective-c swift

我最近在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))

显示上一行中的错误。

2 个答案:

答案 0 :(得分:1)

  

我希望你的建议能解决我的问题。

但您没有提供任何信息,因此无法提出任何建议。 Apple说的是真的;我向您保证,此功能确实有效。问题只能在于您没有按照自己引用的说明进行操作。

答案 1 :(得分:0)

我发现了我的代码存在的问题。

我的应用程序中有两个目标,而且我正在使用测试单元。 由于在所有提到的目标中添加了我的swift代码,因此项目需要有3个与每个目标相关的桥接类,并且必须在所有目标中导入标题。实际上红色消息是关于单元测试桥接文件。

现在,我从测试单元中删除了我的swift类,代码正在编译并运行,没有任何问题。