Hayır, şu anda mümkün değil. o mümkün olsaydı, beklediğiniz sözdizimi olacaktır:
public typealias ArrayClosure<T> = (array:[T]?) -> Void
Daha sonra ArrayClosure<Int>
gibi kullanmak. Ama şu anda yasal değil.
Bu tür takma adlar önermiyorum. Aydınlattıklarından daha fazlasını belirsizler.
func foo(onError: FailureClosure)
ile: bu imzayı karşılaştırın
func foo(onError: NSError? -> Void)
karakterden sadece birkaç kaydetmek için, ne FailureClosure
geçer tahmin etmeye arayan zorlar. error
veya progress
etiketleri gerçekten size yardımcı olmuyor (progress in ...
'u kullanmaya devam etmeniz gerekiyor).
anlamda çok etrafında progress
olduğunu kılan tek olgu, ama istediğiniz türü yoktur düşünüyorum:
public typealias Progress = Float32
, tip örtüşme çok yararlı olabilir burada beni yanlış anlamayın ne zaman Yeni bir tip oluşturur. Progress
, float olarak uygulanacak bir türdür. Ama yaptığınız şeylerin çoğu (kesinlikle ArrayClosure
ile ve diğerleri ile daha az ölçüde) yeni bir tür oluşturmadan yeni bir sözdizimi oluşturuyor ve bu da çoğu zaman yardımcı olmaktan çok kafa karıştırıcı. Bunun gerçekten karmaşık olduğu haklısın
func foo(failure: ((error: NSError?) ->())? = nil)
: tipi takma aşırı tasarımınızı overcomplicate neden olabilir neden
özel örneğini aramak için,. Karşılaştırma:
func foo(failure: NSError -> Void = {_ in return})
Burada iki büyük değişiklik var. İsteğe bağlı bir hataya neden olan bir hata bloğuna sahip olmanıza gerek yoktur. Her zaman bir hata iletin (hata yoksa, neden failure
çağrılmalıdır?). Ve başarısızlık bloğunun isteğe bağlı olması için bir sebep yok. Eğer gerçekten bir varsayılan değer istiyorsanız, sadece varsayılan değeri hiçbir şey yapmayın. İki isteğe bağlı gitti ve tüm tüketim ve uygulama kodları daha da basitleşiyor. Kesinlikle bir şeylerin isteğe bağlı olması gerekip gerekmediğini dikkatlice düşünün. İsteğe bağlı çok karmaşıklık katıyor; onları hafifçe eklemeyin.
Şahsen, muhtemelen yerine birçok durumda bir aşırı ile bu yapardım:
func foo(#failure: NSError -> Void) { ... }
func foo() {
foo(failure:{ _ in return })
}
ben sadece ne olup bittiğini anlamak için biraz daha kolay olduğunu düşünüyorum. Ama her iki yol iyidir.
DÜZENLEME (Aralık 2014): Bir kaç ay daha Swift yazdıktan sonra, aşağıda yorumlarda David'in yaklaşımı kapatılması için isteğe bağlı kullanımı @ daha düşkün büyüdü ama için ettik hata. Özellikle Swift'in isteğe bağlı zincirleme sözdizimi (failure?()
) verildiğinde, çoğu zaman daha net olmak için rüzgar çıkıyor.
Tek bir ayrıntıda şunu belirtmek isterim ki 'typealias', 'T' tanımlandığı sınıflarda tanımlayabilirsiniz. Eğer 'T' nesnesinin genel bir türü ise, 'classealias' öğesini bu sınıfın içinde normal gibi oluşturabilir ve kullanabilirsiniz. Bunu yaparsanız bir not: sınıfın dışında 'typealias' tanımlanmadı, bu yüzden hala tam kapanış sözdizimini görecekler. – vrwim