如何在objective-c项目中使用swift类别?

时间:2016-04-22 15:29:41

标签: ios objective-c swift

我获得了UIImage的快速类别,但我无法弄清楚如何使其发挥作用。

这是我尝试使用的快速类别:

import UIKit

 extension UIImage {
    func imageWithColor(color1: UIColor) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
    color1.setFill()

    let context = UIGraphicsGetCurrentContext()! as CGContextRef
    CGContextTranslateCTM(context, 0, self.size.height)
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetBlendMode(context, CGBlendMode.Normal)

    let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect
    CGContextClipToMask(context, rect, self.CGImage)
    CGContextFillRect(context, rect)

    let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage
    UIGraphicsEndImageContext()

    return newImage
    }
}

在我的目标C视图控制器代码中我试图导入:

#import "UIImage+Overlay.swift"

xcode给了我很多错误,它看起来像Objective C错误。它似乎并不能理解快速的代码。

错误: 意外的' @'在我宣布第一个属性的程序中:

@property (nonatomic, strong) NSArray *contentImages;

正如Leo Natan所说,我确实尝试导入,但我认为是因为我的应用程序的名称。我确实尝试了所有这种导入,但仍然说无法找到它。

#import <ProductName/ProductModuleName-Swift.h>
#import <Say_Cheese_/Say_Cheese_-Swift.h>
#import <Say Cheese!/Say_Cheese_-Swift.h>
#import <Say Cheese!-Say_Cheese_-Swift.h>
#import <Say Cheese!-Bridging-Header.h>

我的产品名称是#34; Say Cheese!&#34; 我的产品模块名称是Say_Cheese_,但后面是$(PRODUCT_NAME:c99extidentifier)

我害怕更改产品模块名称,是否安全?

2 个答案:

答案 0 :(得分:4)

不要导入Swift文件。相反,import the compiler generated "ProductModuleName-Swift.h" file

  

将Swift导入Objective-C

     

当您将Swift代码导入Objective-C时,您依赖于   Xcode生成的头文件将这些文件暴露给Objective-C。这个   自动生成的文件是一个声明的Objective-C头   目标中的Swift接口。它可以被认为是一种   你的Swift代码的标题。这个标题的名称是你的   产品模块名称后跟“-Swift.h”。 (你会了解更多   有关产品模块名称,请参阅命名产品模块。)

     

默认情况下,生成的标头包含Swift的接口   用public修饰符标记的声明。它还包含那些   如果你的应用目标有一个内部修饰符,则标记为内部修饰符   Objective-C桥接头。用私有标记的声明   修饰符不会出现在生成的标题中。私人声明   除非明确标记,否则不会暴露给Objective-C   @IBAction,@ IBMOutlet或@objc。如果您的应用目标已编译   启用测试后,单元测试目标可以访问任何声明   使用内部修饰符,就像它们是与公众一起声明的那样   通过将@testable预先添加到产品模块导入来修改   言。

     

您无需执行任何特殊操作即可创建生成的标头   file-只需导入它以在Objective-C代码中使用其内容。注意   生成的头中的Swift接口包含引用   到它们中使用的所有Objective-C类型。如果你使用自己的   Swift代码中的Objective-C类型,请确保导入   导入Swift之前这些类型的Objective-C标头   生成标题到您要访问的Objective-C .m文件中   Swift代码来自。

在项目的目标中,找到产品模块名称。通常,它与目标具有相同的名称。这将是编译器生成的头文件的名称。

在Objective C源文件中,导入此标题。

#import <ProductModuleName-Swift.h>

每次构建项目时都会生成此头文件,因此对Swift文件的任何更改都需要编译才能在Objective C中使用。

答案 1 :(得分:-1)

我在这个链接上得到了一些提示: How to import Swift code to Objective-C

但要解决这个问题,我确实使用了&#34;&#34;而是&lt;&gt;在#import

#import "SayCheese-Swift.h"

然后我将产品模块名称定义为&#34; SayCheese&#34;没有特殊的字符和空格。

谢谢Leo。