SORU
8 HAZİRAN 2014, Pazar


Ne kadar Hızlı @autoclosure kullanmak

İlk değer olarak yazılan Swift assert yazarken fark ettim

@autoclosure() -> Bool

T genel bir değer, LogicValue protocolüzerinden varlığını test etmek için geri dönmek için aşırı bir yöntem ile.

Ancak yapışmasını kesinlikle eldeki soruya. Döndüren @autoclosure Bool istiyor gibi.

Herhangi bir parametre ve bir Bool çalışmıyor döndüren gerçek bir kapatma yazma, beni derleme yapmak için kapanması gibi aramak istiyor:

assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__)

Ancak bir Bool çalışıyor sadece geçen:

assert(false, "No user has been set", file: __FILE__, line: __LINE__)

Neler oluyor? @autoclosure nedir?

Düzenleme:@auto_closure @autoclosure yeniden adlandırıldı

CEVAP
8 HAZİRAN 2014, Pazar


Bir bağımsız değişken, argüman alır basit bir kapanması gereken bir işlevi göz önünde bulundurun:

func f(pred: () -> Bool) {
    if pred() {
        println("It's true")
    }
}

Bu işlev çağrısı, bir kapatma geçmek zorundayız

f({2 > 1})
// "It's true"

Eğer parantezler ihmal varsa, bir ifade geçiyoruz ve bu bir hata

f(2 > 1)
// error: could not find an overload for '>' that accepts the supplied arguments

@autoclosure ifade otomatik bir kapatma oluşturur. Yani arayan 2 > 1 gibi bir ifade yazdığında otomatik olarak f geçirilmeden önce {2 > 1} olmak için bir kapatma içine sarılmış. Eğer uygularsak işlevi bu 26**:

func f(pred: @autoclosure () -> Bool) {
    if pred() {
        println("It's true")
    }
}
f(2 > 1)
// It's true

Bir kapatma sarın gerek kalmadan sadece bir ifade ile çalışır.

GÜNCELLEME: cevap önceki bir sürümü de otomatik closured açık kapatılması (f({2 > 1}) gibi) işlevi çağrısı olabileceğini dile getirdi. Bu çok yanlış bir şeydi. @Sayesinde JackyBoy ve @ole-begemann.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • Mark Brown

    Mark Brown

    9 HAZİRAN 2010
  • Matus Slovak

    Matus Slovak

    5 Temmuz 2007