Lets say I have a property Wrapper to fetch Feature Flag from a service and assign to a Boolean if it is enabled of not
@propertyWrapper final class FeatureToggle {
var clientContainer: ConfigurableFeatureFlagClient
private let key: String
var wrappedValue: Bool {
FeatureFlag(clientContainer: clientContainer).isEnabled(key: key)
}
init(key: String, container: ConfigurableRemoteConfigClient = RemoteConfigClient.shared) {
self.clientContainer = container
self.key = key
}
}
// Test Class
class TestFeatureToggle {
@FeatureToggle(key: "isFeatureEnabled")
var isFeatureEnabled
}
I'm trying to Make this FeatureToggle Property Wrapper to assume that key default value will be the variable name marked with the property Wrapper, so if @FeatureToggle is marking var isFeatureEnabled so the key will automatically be isFeatureEnabled
Currently I tried using the #function as default value to get the class and use Mirror reflection to get the variable name of the class marked with the property Wrapper
@propertyWrapper final class FeatureToggle {
var clientContainer: ConfigurableRemoteConfigClient
private let key: String
var wrappedValue: Bool {
let factoryClass = Bundle.main.classNamed(key) as! NSObject.Type // Force Unwrap just to simplify the example
let factory = factoryClass.init()
let mirror = Mirror(reflecting: factory)
for child in mirror.children {
guard let featureToggle = child.value as? FeatureToggle else { continue }
let formattedValue = child.label?.dropFirst() // Drop the _ inserted by OBJC
return FeatureFlag(clientContainer: clientContainer).isEnabled(key: formattedValue)
}
return false
}
init(key: String = #function, container: ConfigurableRemoteConfigClient = RemoteConfigClient.shared) {
self.clientContainer = container
self.key = key
print("Self.key == \(self.key)") // It will print "TestFeatureToggle" using my class in previous code
} }
It works but i have to make the class TestFeatureToggle with @objc and makes it inherit from NSObject. Not to mention that this solution looks kind of ugly and hacky. My question is, is there an easier way without exposing to OBJC runtime or a more clean solution?
Aucun commentaire:
Enregistrer un commentaire