簡體   English   中英

如何在objective-c項目中使用swift類別?

[英]How to use swift categories in objective-c project?

我有一個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錯誤。 它似乎無法理解swift代碼。

錯誤:當我聲明第一個屬性時程序中意外的'@':

@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>

我的產品名稱是“Say Cheese!” 我的產品模塊名稱是Say_Cheese_,但后面是$(PRODUCT_NAME:c99extidentifier)

我害怕更改產品模塊名稱,是否安全?

不要導入Swift文件。 而是導入編譯器生成的“ProductModuleName-Swift.h”文件

將Swift導入Objective-C

將Swift代碼導入Objective-C時,依賴於Xcode生成的頭文件將這些文件公開給Objective-C。 這個自動生成的文件是一個Objective-C頭,它聲明了目標中的Swift接口。 它可以被認為是Swift代碼的傘形頭。 此標題的名稱是您的產品模塊名稱,然后添加“-Swift.h”。 (稍后您將在命名產品模塊中了解有關產品模塊名稱的更多信息。)

默認情況下,生成的標頭包含使用public修飾符標記的Swift聲明的接口。 如果您的應用目標具有Objective-C橋接標頭,它還包含標有內部修飾符的那些。 標記為private修飾符的聲明不會出現在生成的標題中。 私有聲明不會暴露給Objective-C,除非它們也明確標記為@IBAction,@ IBMOutlet或@objc。 如果您的應用程序目標是在啟用測試的情況下編譯的,則單元測試目標可以使用內部修飾符訪問任何聲明,就好像它們是使用public修飾符聲明的,方法是將@testable添加到product module import語句中。

您無需執行任何特殊操作來創建生成的頭文件 - 只需將其導入以在Objective-C代碼中使用其內容即可。 請注意,生成的頭中的Swift接口包括對其中使用的所有Objective-C類型的引用。 如果在Swift代碼中使用自己的Objective-C類型,請確保在將Swift生成的頭導入要從中訪問Swift代碼的Objective-C .m文件之前導入這些類型的Objective-C頭。

在項目的目標中,找到產品模塊名稱。 通常,它與目標具有相同的名稱。 這將是編譯器生成的頭文件的名稱。

在Objective C源文件中,導入此標頭。

#import <ProductModuleName-Swift.h>

每次構建項目時都會生成此頭文件,因此對Swift文件的任何更改都需要編譯才能在Objective C中使用。

我在這個鏈接上得到了一些提示: 如何將Swift代碼導入Objective-C

但要解決這個問題,我確實在#import上使用了“”而不是<>

#import "SayCheese-Swift.h"

然后我將產品模塊名稱定義為“SayCheese”而沒有特殊的字符和空格。

謝謝獅子座。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM