【问题标题】:Calling NSString extension defined in Swift from Objective C从 Objective C 调用 Swift 中定义的 NSString 扩展
【发布时间】: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>body{font-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? 并检查它是否返回错误。
  • 还是同样的错误。
  • stackoverflow.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

标签: ios objective-c swift string nsstring


【解决方案1】:
  1. 如果您在同一个项目中处理 Swift 和 Objective-C 文件,那么 xCode 会自动为您创建一个名为 YourProjectName-Swift.h 的文件。
  2. 假设您刚才创建或更新了一个 Swift 扩展。
  3. 这应该会自动更新 YourProjectName-Swift.h 并且 然后通过在你的 Objective-C 类中导入这个头文件 (#import "YourProjectName-Swift.h") 你可以 使用 Swift 代码。
  4. 以防万一,如果没有,您可以手动 更新这个头文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多