从 Objective C 调用 Swift 中定义的 NSString 扩展

Posted

技术标签:

【中文标题】从 Objective C 调用 Swift 中定义的 NSString 扩展【英文标题】:Calling NSString extension defined in Swift from Objective C 【发布时间】:2017-08-28 13:20:35 【问题描述】:

我有一个String 扩展名,我想在objective cNSString 上使用它。由于 swift 中的Stringstruct,因此它不会暴露于objective c。因此,为了从objective c 调用它,我在同一文件中的NSString 上定义了一个extension

public extension NSString 

        func htmlAttributedStringWithFont(font: UIFont, size fontSize: CGFloat = 17.0) -> NSAttributedString? 
            let str = self as String
            return str.htmlAttributedStringWithFont(font: font)
        

    



   extension String 

        /// Converts an HTML String to NSAttributedString
        ///
        /// - Returns: NSAttributedString?
        func htmlAttributedString() -> NSAttributedString? 
            guard let data = self.data(using: .utf16, allowLossyConversion: false) else 
                return nil
            
            guard let html = try? NSMutableAttributedString(
                data: data,
                options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
                documentAttributes: nil) else  return nil 
            return html
        

        /// returns and NSAttributedString optional from HTML content after applying specific font and size
        ///
        /// - Parameters:
        ///   - font: Font to be applied on the returned string
        ///   - fontSize: Size to be applied on the returned string
        /// - Returns: NSAttributedString?
        func htmlAttributedStringWithFont(font: UIFont, size fontSize: CGFloat = 17.0) -> NSAttributedString? 
            let string = self.appending(String(format: "<style>bodyfont-family: '%@'; font-size:%fpx;</style>", font.fontName, fontSize))
            return string.htmlAttributedString()
        

以上两个扩展名在同一个文件String+Extension.swift。然后,我尝试使用NSString 从我的objective c 类中调用htmlAttributedStringWithFont 方法@

[str htmlAttributedStringWithFont:[UIFont systemFontSize]];

它给了我以下错误

 No visible @interface for 'NSString' declares the selector 'htmlAttributedStringWithFont:'

知道如何在Swift 中使用String 扩展名,来自Objective c NSString

【问题讨论】:

我相信带有默认参数的函数不会暴露给 objc。尝试写@objc func htmlAttributedStringWithFont(font: UIFont, size fontSize: CGFloat = 17.0) -&gt; NSAttributedString? 并检查它是否返回错误。 还是同样的错误。 ***.com/questions/27097688/… 看起来 swift/xcode 可能会生成需要导入的 obj-c 标头 检查是否有一行在 ObjC 文件中导入标题 #import "YourProjName-Swift.h"。如果您真的拥有它,请 cmd-单击它。您可能会发现扩展方法以htmlAttributedStringWithFontWithFont:size: 的形式暴露给ObjC。 ObjC 名称由方法名称和参数标签合成。 从 ObjC 调用方法时不提供默认参数。您需要将其用作[str htmlAttributedStringWithFontWithFont:[UIFont systemFontSize] size: 17.0]; 很好用,实际上是htmlAttributedStringWithFontWithFont 而不是htmlAttributedStringWithFont。谢谢@OOPer 【参考方案1】:
    如果您在同一个项目中处理 Swift 和 Objective-C 文件,那么 xCode 会自动为您创建一个名为 YourProjectName-Swift.h 的文件。 假设您刚才创建或更新了一个 Swift 扩展。 这应该会自动更新 YourProjectName-Swift.h 并且 然后通过在你的 Objective-C 类中导入这个头文件 (#import "YourProjectName-Swift.h") 你可以 使用 Swift 代码。 以防万一,如果没有,您可以手动 更新这个头文件。

【讨论】:

以上是关于从 Objective C 调用 Swift 中定义的 NSString 扩展的主要内容,如果未能解决你的问题,请参考以下文章

无法从Objective C中的swift类调用方法

从 Objective C 调用 Swift 中定义的 NSString 扩展

从 Swift 调用 Objective C 自定义初始化函数

是否可以使用情节提要从 swift 类中调用 Objective c 视图控制器类?

从objective-c++调用swift函数

从 Swift 测试文件中调用 Objective-C 类