2015-04-07 26 views
6

2 argümanla hızlı bir sınıf için bir yöntem oluşturuyorum ve her ikisi de isteğe bağlı. ancak, bunlardan en az biri başarıyla çalışma yöntemi, doldurulması gereken, nesnenin hem nil olsaydı biz Assert atmak hangi Amaç-c birSwift isteğe bağlı yöntem argümanları ama en az bir tane doldurulmalı

func someMethod(arg1: Sometype?, arg2: Sometype?)-> Void { 
     //I need at least one argument to 
     //be populated to do what i need 
} 

önemli değil. Swift i "bir assert daha bunu yapmak için daha iyi bir yolu olup olmadığını merak ediyorum

cevap

4

Airspeed Velocity ile, aşırı yükleri burada kullanmanız gerektiğine katılıyorum, ancak bunları farklı hale getireceğim. Tamamen isteğe bağlı olarak kurtulun.

func someMethod(#arg1: Sometype)-> Void {} 

func someMethod(#arg2: Sometype)-> Void {} 

func someMethod(#arg1: Sometype, #arg2: Sometype) -> Void {} 

bu noktada, gerçekten farklı yöntemler olduğu açık olmalı: Biz bir uzunluğa kadar geçebileceği bir FixedLengthString sınıf yapıyor eğer

func someMethodWithArg1(arg1: Sometype)-> Void {} 

func someMethodWithArg2(arg2: Sometype)-> Void {} 

func someMethod(#arg1: Sometype, #arg2: Sometype) -> Void {} 

, bu somut hale düşünün için, veya varolan bir dizgeyi veya her ikisini de geçebilir ve uzunluğu doldurulana kadar dizeyi tekrarlar.

func makeString(length: Int?, string: String?) -> FixedString 

Ama doğrusu bunun dışında sadece yöntemleri yapmak:

olurdunuz tarif ettiğiniz ne

func makeStringWithLength(length: Int) -> FixedString 
func makeStringFromString(string: String) -> FixedString 
func makeStringByFillingWith(string: String, totalLength: Int) -> FixedString 

Bu her şey çalışıyor net nasıl yapar ve çağrı yapamazsınız yanlış. ObjC'de de böyle yapmalısın.

+0

Bence bu en mantıklı ve niyetini net kılıyor, teşekkürler – bolnad

2

yerine aşırı kullanmayın olabilir.

// arg1 cannot be nil 
func someMethod(arg1: Int, arg2: Int?)-> Void { 
    println("arg2 was nil") 
    somePrivateMethod(arg1,arg2) 
} 

// arg2 cannot be nil 
func someMethod(arg1: Int?, arg2: Int)-> Void { 
    println("arg1 was nil") 
    somePrivateMethod(arg1,arg2) 
} 

// this version is needed to avoid annoying "ambiguous call" 
// errors when passing two non-optionals in... 
func someMethod(arg1: Int, arg2: Int)-> Void { 
    println("neither was nil") 
    somePrivateMethod(arg1,arg2) 
} 

private func somePrivateMethod(arg1: Int?, arg2: Int?)-> Void { 
    // private method in which at least arg1 or arg2 will be guaranteed non-nil 
} 


someMethod(1, nil) // prints "arg2 was nil" 
someMethod(nil, 1) // prints "arg1 was nil" 
someMethod(1, 1) // prints "neither was nil" 

// but if you try this: 
someMethod(nil, nil) // error: cannot find an overload for 'someMethod' 
         // that accepts an argument list of type '(nil, nil)' 

bu olumsuz arayan argümanları paketini zorunda olmasıdır - Sadece iki opsiyonelden birini kontrol edemezler, çünkü bunlardan biri sıfır değil, ama bu bir özelliktir, hata değil! Arayanın yanlışlıkla API'yi aramasının fiziksel olarak imkansız olduğu anlamına gelir. yol "ve bir onaylama üretin.

Elbette, bu gerçekten farklı num alır birden fazla aşırı yüklenme isteyip istemediğinizi sorusuna neden olur Kullanım durumunuz bağlamında da dikkate alınması gereken argümanlar ya da farklı türler (bkz. Rob'un cevabı).

+0

, bir arg'in orada olması gereken yöntemlerde, bir tane olmalıdır! someMethod (arg1: Int !, arg2: Int?), someMethod (arg1: In ?, arg2: Int!) – bolnad

+1

Kesinlikle değil. Bir "Int", sadece bir "Int", kullandığınız zaman "örtülü" bir şekilde sarılmış. Eğer 'func someMethod' (arg1: Int !, arg2: Int?) -> Void 'yazdıysanız, o zaman' noMethod (nil, nil) ', en az birinin null olmadığına göre tip tabanlı bir yürütmeyi yenebilirdiniz. –

+0

ooh tamam açıklama için teşekkürler, bu bir atış vereceğim – bolnad