Хотя я лично НАСТОЯТЕЛЬНО советую против пьянства, это, безусловно, вариант здесь.
Сначала начните с создания собственной локали, которую вы хотите использовать в своем приложении:
extension DateFormatter {
// Note the "@objc" here, this is necessary for altering the runtime logic
@objc var swizzledLocale: Locale {
return Locale(identifier: "en_US_POSIX")
}
}
Далее вы захотите сообщить Swift, что всякий раз, когда к языку DateFormatter
обращаются, вы хотите использовать вместо него новый swizzledLocale
:
// get reference to the two getter methods for the properties you want to "switch"
let orig = #selector(getter: DateFormatter.locale)
let new = #selector(getter: DateFormatter.swizzledLocale)
let origMethod = class_getInstanceMethod(DateFormatter.self, orig)!
let newMethod = class_getInstanceMethod(DateFormatter.self, new)!
// performs the actual switch so that whenever "locale" is accessed in code, the returned value will be the value of "swizzledLocale"
method_exchangeImplementations(origMethod, newMethod)
И это все, что нужно сделать ! Теперь, когда вы обращаетесь к любому DateFormatter
locale
, возвращается Locale("en_US_POSIX")
.
Некоторые вещи, на которые следует обратить внимание: во-первых, это изменит ВСЕ экземпляры locale
, а не только locale
s, которые вы лично используете в своем собственном коде. То есть, если есть какой-либо внутренний код, который использует форматировщик locale
, всегда будет использоваться en_US_POSIX
. Во-вторых, второй блок кода (тот, который выполняет фактический перебор) должен вызываться ровно один раз; Посмотрите на это в блок dispatch_once
, чтобы убедиться, что он запускается только один раз.