【发布时间】: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。您应该将 bothMLCCapitalization和方法标记为@objc(public无关紧要),特别是考虑到添加到NSObject派生类的方法将不再默认暴露于Swift 4 中的 Obj-C。 -
啊,是的,我明白了。我用@objc 标记了枚举和函数,它现在出现在我的 Projectname-Swift.h 文件中。感谢那。现在我需要弄清楚如何在我的 Objective-C 代码中访问这个枚举,特别是因为我在我的 .h 文件中使用它。
标签: swift