使用枚举参数自动生成的 Swift 扩展函数

Posted

技术标签:

【中文标题】使用枚举参数自动生成的 Swift 扩展函数【英文标题】:Autogenerated Swift Extension functions with Enum Parameters 【发布时间】: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 文件中使用它。 【参考方案1】:

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

【讨论】:

以上是关于使用枚举参数自动生成的 Swift 扩展函数的主要内容,如果未能解决你的问题,请参考以下文章

Swift语法注意点

Swift/IOS/CoreData:如何在自动生成的 CoreData 类中将 var 定义为枚举类型?

Swift 会自动克隆参数吗?

Jmeter接口自动化测试系列之函数使用及扩展

在本机 safari 应用程序扩展中,我们如何使用 swift 的参数调用 javascript 函数?

如何在 uilabel 中使用多行并根据 Swift 中的标签高度自动扩展 uitableview 行高?