2016-07-09 7 views
0

obj-cプロジェクトを迅速に変換する状況があります。次のようになりますオブジェクトを変換する-c動的バインディングをスウィフトに変換する2

// few lazy property initializers as, 
    @property (nonatomic, strong) MyObject *property1; 
    @property (nonatomic, strong) MyObject *property2; 
    @property (nonatomic, strong) MyObject *property3; 
    ... 

    // I keep an index value to map these into a dictionary for reference 
    - (NSDictionary *)indexMap 
    { 
    if (!_indexMap) 
    { 
    _indexMap = @{ 
    @(index1) : [NSValue valueWithPointer:@selector(property1)], 
    @(index2) : [NSValue valueWithPointer:@selector(property2)], 
    ... 
    }; 
    } 
    return _indexMap; 
    } 

// other dictionary for index to class map 
- (NSDictionary *)classMap 
{ 
return @{ 

NSStringFromClass(@"MyClassA") : @(index1), 
NSStringFromClass(@"MyClassB") : @(index1), 
NSStringFromClass(@"MyClassC") : @(index1), 

NSStringFromClass(@"MyClassD") : @(index2), 
NSStringFromClass(@"MyClassE") : @(index2), 

NSStringFromClass(@"MyClassF") : @(index3), 
... 
}; 
} 

// finally i have method to pass in the class name & it will first find corresponding index, then use the index to return the property selector. 

私の懸念は、これを行うのが速いのですか?

+0

ああ、私たちはスウィフトでこれを行うことができない感謝の神を。 – Sulthan

答えて

0

これを行う1つの方法は、初期化を実行するコールバックのリストを保持することです。シンプルな代替案は確かに可能であるが、ここでは非常に柔軟性のある一つの解決策は、次のとおりです。

class ComponentManager { 

    // Global singleton: ComponentManager.sharedManager 
    static let sharedManager = ComponentManager() 

    // Define a callback type which is used to create instances. 
    // This is the lazy initialiser. 
    typealias Constructor =() -> NSObject? 

    private var constructor = [String: Constructor]() 
    private var instances = [String: NSObject]() 

    func register(name: String, constructor: Constructor) { 
     self.constructor[name] = constructor 
    } 

    func instanceNamed(name: String) -> NSObject? { 

     if let instance = instances[name] { 
      return instance 
     } 

     guard let constructor = constructor[name] else { 
      return nil 
     } 

     guard let instance = constructor() else { 
      return nil 
     } 

     instances[name] = instance 

     return instance 
    } 
} 

それを使用するには:

class A: NSObject { 
    let foo: String 
    init(foo: String) { 
     self.foo = foo 
    } 
} 

class B: NSObject { 
    let bar: Int 
    init(bar: Int) { 
     self.bar = bar 
    } 
} 

let manager = ComponentManager.sharedManager 

// Register our classes. 
// Note the callback functions which actually perform the 
// initialisation, these are only called when the class is requested the 
// first time. 
manager.register("A") { return A(foo: "fizz") } 
manager.register("B") { return B(bar: 47) } 

// Create some instances 
let a = manager.instanceNamed("A") as? A 
let b = manager.instanceNamed("B") as? B 
let a2 = manager.instanceNamed("A") as? A 

print("a = \(a?.foo)") 
print("a2 = \(a?.foo)") 
print("b = \(b?.bar)") 
関連する問題