【问题标题】:Autogenerated Swift Extension functions with Enum Parameters使用枚举参数自动生成的 Swift 扩展函数
【发布时间】:2017-06-01 19:52:55
【问题描述】:

我有一个 Swift 3.1 NSString 扩展,看起来像这样:

enum MLCCapitalization : Int {
    case upperCase
    case lowerCase
    case na 
}

extension NSString {

    func MLC_stringByCapitalizingFirstLetterWithCapitalization(_ capitalization: MLCCapitalization, locale: Locale) -> NSString {
        let firstWordRange = rangeOfCharacter(from: CharacterSet.letters)
        guard firstWordRange.location != NSNotFound && capitalization != .na else {
            return self
        }

        let firstLetterRange = NSMakeRange(firstWordRange.location, 1)
        var firstLetter = substring(with: firstLetterRange)

        switch capitalization {
        case .upperCase:
            firstLetter = firstLetter.uppercased(with: locale)
        case .lowerCase:
            firstLetter = firstLetter.lowercased(with: locale)
        case .na:
            break
        }

        return replacingCharacters(in: firstLetterRange, with: firstLetter) as NSString
   }
}

我试图从 Objective-C 中调用它,但是这个函数并没有在我的 projectname-Swift.h 头文件中自动生成。看起来是这样的

@interface NSString (SWIFT_EXTENSION(ProjectName))
@end

似乎这个扩展函数中的枚举参数导致了问题(当我将它更改为 Int 时,它会生成。)这在 Swift 3.0 中运行良好。我错过了什么?

【问题讨论】:

  • 如果你想暴露一些东西给 Obj-C,你应该把它标记为@objc ;)
  • Uhmmm ...这是系统类的扩展,不是我自己的类。并且将此扩展程序标记为公开也无济于事。
  • 是的,但是因为MLCCapitalization 没有标记为@objc,所以您的方法不会被推断为@objc。您应该将 both MLCCapitalization 和方法标记为 @objcpublic 无关紧要),特别是考虑到添加到 NSObject 派生类的方法将不再默认暴露于Swift 4 中的 Obj-C。
  • 啊,是的,我明白了。我用@objc 标记了枚举和函数,它现在出现在我的 Projectname-Swift.h 文件中。感谢那。现在我需要弄清楚如何在我的 Objective-C 代码中访问这个枚举,特别是因为我在我的 .h 文件中使用它。

标签: swift


【解决方案1】:

所以这里的答案是从我的 Swift 扩展文件中删除枚举并将其放入一个 Objective-C 头文件中。这个 objc 头文件可以包含在桥接头文件中,以便 Swift 也可以使用它。如果我不需要在我的一些 Objective-C 头文件中使用枚举,那么按照 @Hamish 的建议去做就可以了。如果没有 Swift 扩展文件中的枚举,就不需要用 @objc 标记函数。感谢@Hamish 为我指明了正确的方向。

【讨论】:

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