2016-09-19 1 views
1

In Swift 2.3 konnte ich dynamisch Methoden aufrufen, die Parameter mit NSSelectorFromString("methodWithArg:") benannt hatten. In Swift 3 muss ich _ einem benannten Parameter voranstellen, damit er ohne seinen Namen aufgerufen werden kann.NSSelectorFromString mit benannten Parametern in Swift 3

Ist das noch möglich? Sehen Sie sich diesen Spielplatzcode für einen Testfall an.

class Parent : NSObject { 
    func parentSelector(_ arg: String) { 
     print(" ---> Selected: \(arg)") 
    } 
    func test(_ selectorString: String, _ printString: String) { 
     let selector : Selector = NSSelectorFromString(selectorString) 
     // if self.responds(to: selector) { 
      self.perform(selector, with: printString) 
     // } 
    } 
} 

class Child : Parent { 
    func childSelector(_ arg: String) { 
     print(" ---> Child selected: \(arg)") 
    } 
    func namedChildSelector(arg: String) { 
     print(" ---> Child selected: \(arg)") 
    } 
} 

let parent = Parent() 
parent.test("parentSelector:", "apple") // Works 

let child = Child() 
child.test("parentSelector:", "banana") // Works 
child.test("childSelector:", "coffee") // Works 
child.test("namedChildSelector:", "daffodil") // Throws `NSInvalidArgumentException` 
child.test("namedChildSelector(_:)", "daffodil") // Throws `NSInvalidArgumentException` 
+0

'child.test (" namedChildSelectorWithArg: "," Narzisse ")' – vacawama

+0

Ich habe beide versucht, beide geben einen Fehler. Ich werde bearbeiten, um zu zeigen, dass beide dasselbe tun. –

+0

Sind Sie sicher? Die obige Linie funktioniert für mich auf einem Spielplatz. – vacawama

Antwort

2

In Swift 3, wobei der erste Parametername ist Teil des Wahlname, so müssen Sie WithArg hinzufügen, wenn das erste Argument Name arg ist:

child.test("namedChildSelectorWithArg:", "daffodil") 
+1

Wo ist die Dokumentation dazu? –

Verwandte Themen