从 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 c
的NSString
上使用它。由于 swift 中的String
是struct
,因此它不会暴露于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) -> 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 中定义的 NSString 扩展
从 Swift 调用 Objective C 自定义初始化函数