2015-01-28 19 views
17

Przepraszamy za te pytania4 Pytania dotyczące selektorów w Swift

Mam 4 pytania dotyczące Selectora w szybkim tempie.

pierwsze pytanie

Zastanawiam się, co to jest właściwy sposób korzystać z selektora w szybkim

closeBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Stop, target: self, action: Selector("closeBarButtonItemClicked:")); 

VS

closeBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Stop, target: self, action: "closeBarButtonItemClicked:"); 

powinniśmy używać Selector ("methodName:") lub "methodName:" od razu?

Obydwie metody działają, ale która z nich jest poprawna?

Drugie pytanie

Jak wywołać funkcję z parametrem w Swift? Powiedzmy, że chcemy wywołać funkcję jak ten

func methodName(parameterOne : String, parameterTwo: String) 

Trzecie pytanie

Jak wywołać metodę typu przy użyciu Selector w systemie SWIFT? czy to w ogóle możliwe?

class SomeClass { 
class func someTypeMethod() { 
// type method implementation goes here 
    } 
} 

czwartym pytaniu

Jaki jest cel tego okrężnicy za nazwą funkcji selektor?

+7

Co do ostatniego pytania, po nazwie funkcji nie ma dwukropka. Dwukropek jest * częścią * nazwy funkcji. Funkcja o nazwie 'xyz:' jest całkowicie inną funkcją niż ta o nazwie 'xyz'. –

+1

http://stackoverflow.com/questions/24007650/selector-in-swift ten post zawiera szczegółowe objaśnienie selektorów. – Gerald

+0

Nie błagaj o powtórzenia lub pobicia. Dzięki. – Moritz

Odpowiedz

14

Pytanie 1: Nie sądzę, że istnieje naprawdę poprawny sposób. Osobiście wolę drugą drogę, ale obie działają, więc nie sądzę, żeby to miało naprawdę znaczenie.

Pytanie 2: Po prostu ponownie przeczytałem pytanie. Myślę, że masz na myśli, jak to nazwać w selektorze. Wybieracz do tego, jak sądzę, byłby "methodName:parameterTwo:", ale nie jestem pozytywny, ponieważ selektor z dwoma parametrami prawdopodobnie powinien mieć zewnętrzną nazwę parametru do umieszczenia w selektorze, gdzie parametrTwo jest w mojej odpowiedzi.

Old odpowiedź na pytanie 2 (przed edycji): Można by nazwać tę funkcję jako methodName(variable1, parameterTwo: variable2). Jeśli chciał zrobić im powiedzieć nazwa parametr w wywołaniu można zrobić nagłówek methodName(calledVarName parameterOne: String, calledVarName2 parameterTwo: String). Będzie to nazywane jako methodName(calledVarName: variable1, calledVarName2: variable2). Możesz także zdefiniować nagłówek jako methodName(#parameterOne: String, #parameterTwo: String). To byłoby nazywane jako methodName(parameterOne: variable1, parameterTwo: variable2). Przeczytaj więcej tutaj: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

Pytanie 3: Nie mogę powiedzieć na pewno, ale nie sądzę, że istnieje sposób na wybór tego. Jeśli istnieje, zakładam, że będzie to "someTypeMethod"

Stare pytanie 3 odpowiedź (przed edycją): Możesz wywołać tę metodę przez SomeClass.someTypeMethod().

Pytanie 4: Okrężnica oznacza, że ​​nagłówek funkcji ma parametr.Tak więc "function1:" odpowiada func function1(someParameterName: AnyObjectHere), podczas gdy "function1" odpowiada func function1().

+0

Bardzo ładnie odpowiedział! – Tokuriku

17

@ odpowiedź ad121 jest pra-po prostu chcą dodać trochę kontekst # 1:

Typ Selector został rozszerzony w Swift być StringLiteralConvertible. Za każdym razem, gdy oczekiwana jest instancja Selector, możesz zamiast tego podać literał ciągu, a dla ciebie zostanie utworzona instancja Selector. Oznacza to, że można również utworzyć instancję Selector z ciągiem dosłownym ręcznie:

let mySelector: Selector = "methodName:withParameter:" 

Zauważ, że ten nie oznaczać String może być stosowany zamiennie z Selector -To działa tylko z napisowych. Dodaje się nie powiedzie:

let methodName = "methodName:withParameter:" 
let mySelector: Selector = methodName 
// error: 'String' is not convertible to 'Selector' 

W że przypadek trzeba by faktycznie wywołać konstruktor Selector siebie:

let methodName = "methodName:withParameter:" 
let mySelector = Selector(methodName) 
4

Odpowiadając 3rd pytanie: Można to zrobić całkowicie. Po prostu ustaw parametr docelowy na typ.

Powiedzmy, że masz klasę zdefiniowane:

class SomeType { 
    class func someMethod() {} 
    func someMethod() {} 
} 

Teraz bierze swój przykład, będzie to wywołać metodę instancji:

let something = SomeType() 
let closeBarButtonItem = UIBarButtonItem(barButtonSystemItem:UIBarButtonSystemItem.Stop, target: something, action: "someMethod") 

zmienić miejsce docelowe, a połączenie będzie uzyskać przekazany do typu:

let closeBarButtonItem = UIBarButtonItem(barButtonSystemItem:UIBarButtonSystemItem.Stop, target: SomeType.self, action: "someMethod") 
Powiązane problemy