1

Swift 3 在 NSLocale(现在的 Locale)类中引入了很多变化。我需要执行方法 swizzleNSLocale.currentLocale()来执行一些助手的单元测试。使用 Swift 2.3,我可以使用这种方法:

extension NSLocale {
    @nonobjc static var ttt_locale = "us_US"
    @nonobjc static var ttt_swizzled = false

    class func customizedLocale()->NSLocale{
        return NSLocale(localeIdentifier: NSLocale.ttt_locale)
    }

    class func forceLocale(identifier:String){
        NSLocale.ttt_locale = identifier

        if !NSLocale.ttt_swizzled {
            NSLocale.ttt_swizzled = true
            let originalSelector = #selector(NSLocale.currentLocale)
            let swizzledSelector = #selector(self.customizedLocale)

            let originalMethod = class_getClassMethod(self, originalSelector)
            let swizzledMethod = class_getClassMethod(self, swizzledSelector)

            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
} 

现在的问题是 Swift 3currentLocale不再是,它已经被 property 取代了current

Swift 3 怎么能达到同样的效果呢?

4

1 回答 1

3

current是 的(只读)计算属性NSLocale

open class var current: Locale { get }

您为 Objectice-C 属性获取器构建了一个选择器

let originalSelector = #selector(getter: NSLocale.current)

另请参阅SE-0064 引用属性 getter 和 setter 的 Objective-C 选择器

于 2016-11-22T10:44:01.837 回答