Objective-C Varsayılan Argüman Değer

5 Cevap php

Hey orada, burada hızlı bir soru. Ben basit bir cevabı var eminim.

PHP geliyor, ben böyle bir öntanımlı argüman değere sahip bir işlev ilan alışığım:

function myFunction ($array, $sort = FALSE)  {

}

Sıralama parametresi dolu değildi ben, fonksiyon false varsayılan değer ile devam edecekti. Obj-C, benzer bir şey var mı?

Ben kitap benim "Objective-C 2.0 Programlama" egzersizleri ile çalışıyorum ve bana kesir azaltmak değil-ly varsayılan yeniden yazmak bir kısmını sınıf baskı fonksiyonu istiyor, ama azaltmak için TRUE değeri verilirse , go ahead ve kesir azaltmak, daha sonra yazdırabilirsiniz. Bölüm (Nor hiçbir kitapta) bu konuda herhangi bir bilgi verir.

Lütfen yardım çocuklar için teşekkürler: D

5 Cevap

Standart argümanlar başına, Objective-C yok. Argüman sayısı ayrılmaz yöntem adı bağlıdır çünkü onlar gerçekten, olamaz - her kolon bir argüman karşılık gelir.

Objective-C programcıları sadece varsayılan değerleri ile doldurulur argümanlar bazı daha "ilkel" yöntemine çağrı "kolaylık" yöntemleri oluşturarak olsa da, benzer bir hedefe ulaşmak. Örneğin, -[NSArray indexOfObject:] NSMakeRange(0, [self count]) inRange: bölümü için bir argüman ile -[NSArray indexOfObject:inRange:] sürümü olarak uygulanabilir.

Bu durumda olsa da, ben kitap bu konuda konuşuyor sanmıyorum. Ben sadece EVET reduce: argüman için verilen ve NO verilir eğer azaltmak değilse kesir azaltmak demektir düşünüyorum.

Ne istediğinizi elde etmek için iki standart desenler vardır.

(1) bir yöntem bir çok argüman formu yazıp az argüman kolaylık sürümleri sağlamak. Örneğin, NSString aşağıdaki yöntemleri göz önünde bulundurun:

- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask
            range:(NSRange)compareRange;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask
            range:(NSRange)compareRange locale:(id)locale;

İlk üç kavramsal vardır [olasılıkla somut ve ben onay vermedi] dördüncü sürümüne üzerinden görüşme olarak uygulanmaktadır. Yani,-karşılaştırma edilir: aramalar-Karşılaştırma: seçenekleri: aralığı: locale: üç ek argümanlar için uygun varsayılan değerleri.

(2) Diğer desen yöntemin birçok argüman sürümü uygulamak ve bir argüman NULL / nil veya varsayılan istenen gösterir bazı değerine ayarlı olduğunda varsayılan değerleri sağlamaktır. NSData bu deseni ile uygulanan yöntemleri vardır. Örneğin:

+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask
            error:(NSError **)errorPtr;

Eğer readOptionsMask argüman 0 başarılı olursa, NSData bir dahili tanımlanmış varsayılan yapılandırma kullanarak dosyanın içeriğini okuyacaktır. Bu varsayılan yapılandırma zamanla değişebilir.

Bu soru süper eski, ama durumda herkes bulur, (bu bir sınıfın içinde olduğunu varsayarak) PHP kod Objective-C versiyonu muhtemelen böyle bir şey olurdu:

-(id)myFunction:(NSArray*)array {
  return [self myFunction:array withSort:FALSE];
}

-(id)myFunction:(NSArray*)array withSort:(BOOL)useSort {
   // CODE
}

PHP kodu hiçbir veri türü bir bilgi olarak ben (id) s kullanılır. Gerçek veri türleri ile (id) ler değiştirilmesi akıllıca olacaktır.

Berbat nekroz ancak bu googling herkes için, C fonksiyonların aşırı yükleme (Clang ile) Xcode 4,5 destekleri __attribute__((overloadable)).

Aşırı yüklenmiş fonksiyonlar argümanlar farklı numaralar için izin verilir, bu nedenle C fonksiyonları uygun iseniz yapmaya çalışıyoruz ne için varsayılan argüman değerleri almak için kullanabilirsiniz.

. Burada iki fonksiyon, denilen her ikisi ile bir h dosyası yapmacık bir örnek PrintNum:

// Prints a number in the decimal base
__attribute__((overloadable)) extern void PrintNum(NSNumber *number);

// Prints a number in the specified base
__attribute__((overloadable)) extern void PrintNum(NSNumber *number, NSUInteger base);

ve m dosyasında.:

__attribute__((overloadable)) 
void PrintNum(NSNumber *number) {
    PrintNum(number, 10);
}

__attribute__((overloadable))
void PrintNum(NSNumber *number, NSUInteger base) {
    // ...
}

Öznitelik işlevinin tüm tanımları ve bildirimleri belirtilen gerektiğini unutmayın.

Hayır, varsayılan argümanlar C + + değil, C veya Objective-C bir özelliği vardır.

Ne objektif-c yapmak zorunda olurdu (yukarıdaki pseudo kodu kullanarak) aşağıdaki gibidir:

function myFunction ($array, $sort)

function myFunction ($array)
// call myFunction($array, FALSE)