NSLocale.currentLocale 的端口方法从 swift 2.3 到 swift 3
Port method swizzle of NSLocale.currentLocale from swift 2.3 to swift 3
Swift 3 在NSLocale(现在是Locale)中引入了很多变化class。我需要执行 NSLocale.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 3 currentLocale
不再存在,它已被 属性 current
取代。
如何用 Swift 3 达到相同的结果?
current
是 NSLocale
:
的(只读)计算 属性
open class var current: Locale { get }
您使用
为 Objectice-C 属性 getter 构建了一个选择器
let originalSelector = #selector(getter: NSLocale.current)
另见 SE-0064 Referencing the Objective-C selector of property getters and setters。
Swift 3 在NSLocale(现在是Locale)中引入了很多变化class。我需要执行 NSLocale.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 3 currentLocale
不再存在,它已被 属性 current
取代。
如何用 Swift 3 达到相同的结果?
current
是 NSLocale
:
open class var current: Locale { get }
您使用
为 Objectice-C 属性 getter 构建了一个选择器let originalSelector = #selector(getter: NSLocale.current)
另见 SE-0064 Referencing the Objective-C selector of property getters and setters。