使用枚举参数自动生成的 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
和方法标记为 @objc
(public
无关紧要),特别是考虑到添加到 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/IOS/CoreData:如何在自动生成的 CoreData 类中将 var 定义为枚举类型?