Objective-C'deki Seçiciler?


122

İlk olarak, bir seçicinin ne olduğunu gerçekten anladığımdan emin değilim. Anladığım kadarıyla, bu bir yöntemin adı ve bunu 'SEL' türündeki bir sınıfa atayabilir ve ardından alıcının bu yöntemi uygulayıp uygulamadığını görmek için responseToSelector gibi yöntemleri çalıştırabilirsiniz. Birisi daha iyi bir açıklama sunabilir mi?

İkincisi, bu noktaya kadar aşağıdaki koda sahibim:

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

Bununla birlikte, thingaçıkça bir tür NSString olmasına ve küçük harf dizisine yanıt vermesi gerekse de, "YES" döndürmek için 'responsesToSelector' koşulunu alamıyorum ...


Apple geliştirici sitesinde Seçici açıklamasını okumak istiyorsunuz: Seçiciler .
lothar

14
Stanford kursu CS193P ödevi 1B? Burada tam olarak aynı sorum var! :)
Corstian Boerman

Yanıtlar:


181

Yöntem isimleri konusunda çok dikkatli olmalısınız. Bu durumda, yöntem adı sadece " lowercaseString" olur, " lowercaseString:" değildir (iki nokta üst üste bulunmadığına dikkat edin). Bu yüzden NOgeri geliyorsunuz , çünkü NSStringnesneler lowercaseStringmesaja cevap veriyor ama mesaja cevap vermiyor lowercaseString:.

Ne zaman iki nokta üst üste ekleneceğini nasıl anlarsınız? Mesajı çağırırken iki nokta üst üste eklerseniz, mesaj adına iki nokta üst üste eklersiniz, bu bir bağımsız değişken alırsa gerçekleşir. Sıfır bağımsız değişken alırsa (durumunda olduğu gibi lowercaseString), o zaman iki nokta üst üste yoktur. Birden fazla argüman gerektiriyorsa, fazladan argüman isimlerini iki nokta üst üste ile birlikte eklemeniz gerekir compare:options:range:locale:.

Ayrıca belgelere bakabilir ve sonunda iki nokta üst üste işareti olup olmadığını da not edebilirsiniz.


12

Seçiciler , yöntemlere doğrudan derlenmiş kodda başvurmanın etkili bir yoludur - derleyici, değeri gerçekte bir SEL'ye atayan şeydir.

Diğerleri zaten q'nuzun ikinci bölümünü ele almışlardır, sondaki ':' aradığınızdan farklı bir imzayla eşleşir (bu durumda imza yoktur).


10

Çünkü sen istiyorsun @selector(lowercaseString), değil @selector(lowercaseString:). İnce bir fark vardır: İkincisi bir parametreyi ifade eder (sondaki iki nokta üst üste işaretine dikkat edin), ancak - [NSString lowercaseString]bir parametre almaz.


5

Bu durumda seçicinin adı yanlıştır. Buradaki iki nokta üst üste, yöntem imzasının bir parçasıdır; bu, yöntemin bir argüman aldığı anlamına gelir. İstediğine inanıyorum

SEL sel = @selector(lowercaseString);

3

NSString'in yöntemi lowercaseString(0 bağımsız değişken) değil lowercaseString:(1 bağımsız değişken).


1

İki noktayı işlev adının bir parçası olarak düşünmeyin, ayırıcı olarak düşünün, ayıracak bir şeyiniz yoksa (işleve uygun bir değer yoksa) ihtiyacınız yoktur.

Neden olduğundan emin değilim ama tüm bu OO olayları Apple geliştiricilerine yabancı görünüyor. Visual Studio Express'i almanızı ve bununla uğraşmanızı şiddetle öneririm. Biri diğerinden daha iyi olduğu için değil, sadece tasarım konularına ve düşünce tarzlarına bakmanın iyi bir yolu.

Sevmek

introspection = reflection
+ before functions/properties = static
- = instance level

Bir probleme farklı şekillerde bakmak her zaman iyidir ve programlama nihai bilmecedir.


0

Apple belgelerine ilişkin anlayışıma göre, bir seçici, aramak istediğiniz yöntemin adını temsil eder. Seçicilerle ilgili güzel olan şey, onları tam olarak çağrılacak yöntemin değiştiği durumlarda kullanabilmenizdir. Basit bir örnek olarak, aşağıdaki gibi bir şey yapabilirsiniz:

SEL selec;
if (a == b) {
selec = @selector(method1)
}
else
{
selec = @selector(method2)
};
[self performSelector:selec];

0

Apple dokümanlarına göre: https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

Seçici, bir nesne için yürütülecek yöntemi seçmek için kullanılan ad veya kaynak kodu derlendiğinde adın yerini alan benzersiz tanımlayıcıdır. Bir seçici kendi başına hiçbir şey yapmaz. Basitçe bir yöntemi tanımlar. Seçici yöntem adını düz bir dizeden farklı kılan tek şey, derleyicinin seçicilerin benzersiz olduğundan emin olmasıdır. Bir seçiciyi kullanışlı kılan şey, (çalışma zamanıyla bağlantılı olarak), belirli bir ad için, hangi sınıfla birlikte kullanılırsa kullanılsın uygun bir yöntemin uygulanmasına otomatik olarak işaret eden dinamik bir işlev işaretçisi gibi davranmasıdır. Çalıştırılan yöntem için bir seçiciniz olduğunu ve Köpek, Sporcu ve Bilgisayar Simülasyonu (her biri bir yöntem çalıştırması uygulayan) sınıflarınız olduğunu varsayalım.

Örnek: (lldb) breakpoint - set selector viewDidLoad

Bu, uygulamanızdaki tüm viewDidLoad uygulamalarında bir kesme noktası belirler. Dolayısıyla seçici, bir yöntem için küresel bir tanımlayıcıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.