2015-01-28 35 views
17

Bu soru için özür dileriz4 Swift ile İlgili Seçiciler.

Selector in swift hakkında 4 soru var. ("MethodName:")

İLK Soru

Ben

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

biz Selector'ü kullanmalıyım hızlı

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

VS

seçiciyi kullanmak için uygun bir yol olduğunu merak ediyorum veya "methodName:" hemen?

Her iki şekilde çalışır, ancak hangisi doğru yoldur?

İKİNCİ Soru

nasıl Swift bir parametresi olan bir işlev denir? Diyelim ki bu

func methodName(parameterOne : String, parameterTwo: String) 

ÜÇÜNCÜ Soru biz Swift içinde Seçici kullanarak bir tür yöntemini çağırın nasıl

gibi bir işlev çağırmak istediğinizi varsayalım? hatta mümkün mü?

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

DÖRDÜNCÜ Soru Seçici işlevi isminin arkasında o kolonun amacı nedir

?

+7

Son sorunuzda, işlev adından sonra iki nokta üst üste yok. Kolon * işlev adının * bir parçasıdır. 'Xyz:' adlı işlev, xyz adlı isminden tamamen farklı bir işlevdir. –

+1

http://stackoverflow.com/questions/24007650/selector-in-swift bu gönderide seçmenler hakkında detaylı bir açıklama var – Gerald

+0

Tekrarlama veya upvotes için dilenme. Teşekkürler. – Moritz

cevap

14

Soru 1: Gerçekten doğru bir yol olduğunu düşünmüyorum. Ben şahsen ikinci yolu tercih ederim, ama her ikisi de işe yarıyor, bu yüzden gerçekten önemli değil.

Soru 2: Sadece tekrar okudum. Sanırım bunu bir seçicide nasıl arayacağınızı kastediyorsunuz. Seçicinin "methodName:parameterTwo:" olduğuna inanıyorum ama pozitif değilim, çünkü iki parametreli seçicinin, muhtemelen, parameterTwo'nun benim cevabım içinde olduğu, seçiciye yerleştirilecek bir harici parametre adı olması gerekir.

Eski soru 2 cevap (düzenlemek öncesinde): Onları çağrısında parametre adı başlığını methodName(calledVarName parameterOne: String, calledVarName2 parameterTwo: String) yapabiliriz söyletmeye isteseydim Sen methodName(variable1, parameterTwo: variable2). olarak bu işlevi çağırır. Bu methodName(calledVarName: variable1, calledVarName2: variable2) olarak adlandırılacaktır. Başlığı methodName(#parameterOne: String, #parameterTwo: String) olarak da tanımlayabilirsiniz. Bu methodName(parameterOne: variable1, parameterTwo: variable2) olarak adlandırılacaktır. Daha fazla bilgi için: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

Soru 3: Elbette emin değilim ama bunun için bir seçici yapmanın bir yolu olduğunu düşünmüyorum. Varsa, "someTypeMethod"

Eski soru 3 yanıtı (düzenleme öncesinde): Bu yöntemi SomeClass.someTypeMethod() olarak çağırabilirsiniz.

Soru 4: Kolon, işlev üstbilgisinin bir parametresi olduğunu belirtir.Yani "function1:", func function1(someParameterName: AnyObjectHere)'a karşılık gelirken "function1", func function1()'a karşılık gelir. ad121 cevabı @

+0

Çok güzel cevaplandı! – Tokuriku

17

harika-sadece 1. biraz içerik eklemek istiyorum:

Selector tip StringLiteralConvertible olmak Swift de uzatıldı. Herhangi bir zaman bir Selector örneği bekleniyor, bunun yerine bir dize değişmezi verebilir ve sizin için bir Selector örneği oluşturulacaktır. Bu el ile de değişmez bir dize gelen bir Selector örneğini oluşturmak anlamına gelir: Bu bir String bir Selector birbirinin yerine kullanılabilir anlamına gelmez

let mySelector: Selector = "methodName:withParameter:" 

Not dize değişmezleri ile çalışan tek -bu. Aşağıdaki başarısız olur:

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

size ihtiyacım olacağını durum aslında Selector yapıcı kendini aramak o:

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

da 3. sorusunu yanıtlayan: Tamamen yapabilirsiniz. Sadece hedef parametreyi kendi tipine göre ayarlayın.

tanımladığınız bir sınıf olduğunu varsayalım: Hedef ve çağrı tipi iletilir alacak

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

Değiştir:

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

Şimdi örnek alarak bu örnek yöntemini çağırır:

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