具有枚举参数的自动生成的Swift扩展功能

时间:2017-06-01 19:52:56

标签: swift

我有一个Swift 3.1 NSString Extension,如下所示:

identical(arrange(res, UID) %>% as.matrix, arrange(res2, UID) %>% as.matrix)
## [1] TRUE

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

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
   }
}

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

1 个答案:

答案 0 :(得分:0)

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