Swift

2015-01-13 11 views
8

'daki kapatma örneklerini anlamıyorum Hızlı ve kapanışları öğrenmeye çalışıyorum. Bu örnekte takılıyorum.Swift

numbers.map({ 
    (number: Int) -> Int in 
    let result = 3 * number 
    return result 
}) 

Nedir (sayı: Int) -> Int? Bu bir işlev mi? Nerede tanımlanır? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

"in" anahtar kelimesi ne yapar? Dokümanlar, "argümanları ayırmak ve vücuttan dönüş tipini" kullanacaklarını söylüyor. Bunu anladığımdan emin değilim. Neden "in", "sonuçtan 3 sonuç" sonucunu "sonuçtan" ​​ayırmak için kullanılmıyor?

+2

Bu aynı zamanda Swift: http: //letvargo.mooo.com/a-beginners-guide-to-closures-in-swift/) –

cevap

28

içeriği, Parametreleri fonksiyon gövdesinden ayırmak için in anahtar kelimesi ile.

func myFunc(number: Int) -> Int { 
    let result = 3 * number 
    return result 
} 

let myClosure = { (number: Int) -> Int in 
    let result = 3 * number 
    return result 
} 

Aslında tamamen aynı şekilde ikisini de çağırabilirsiniz: İki Aşağıdaki örnekler eşdeğer işlevleri tanımlamak İkinci örnek sadece, da aynı öncekiler nasıl

let x = myFunc(2)  // x == 6 
let y = myClosure(2) // y == 6 

Bildirimi İlk örnek, (number: Int) -> Int parametreleri parantezlerin dışındadır ve ikinci örnekte parametreler parantez içinde, ardından in anahtar sözcüğüdür. bir (daki örnekte numbers) dizisi ve numbers her elemana kapatma fonksiyonu uygulanması sonucu olan yeni bir dizi oluşturma alarak

map çalışır. Yani numbers[1, 2, 3] ise, yukarıdaki örnek 1 ile başlayacaktır. Bir 3 üretecek olan kapatma işlevini uygulayacaktır (tüm bu özellik, ilk diziden öğeyi 3 ile çarpacaktır). [3, 6, 9], yeni bir dizi üretene kadar numbers'daki her öğe için bunu yapar.

İsterseniz yukarıdaki işlevlerin veya yukarıdaki kapağın isimlerini kullanarak veya map'un içinde açıkça yazarak map numaralı telefonu arayabilirsiniz. Aşağıdaki örneklerin hepsi tamamen eşdeğerdir: Örnek 3 Örnek 2'deki ile aynı olduğu

let numbers = [1, 2, 3] 

// Example 1 
let times3 = numbers.map(myFunc)  // times3 == [3, 6, 9] 

// Example 2 
let timesThree = numbers.map(myClosure) // timesThree == [3, 6, 9] 

// Example 3 
let xThree = numbers.map({ (number: Int) -> Int in 
    let result = 3 * number 
    return result      // xThree == [3, 6, 9] 
}) 

Not Örnek 2'de kapak atanmış ise, sadece Örnek 3'te kapak, açık map içinde yazıldığından myClosure adı verilen bir sabite ve sabit map'a verilmiştir.

Bu yardımcı olur umarım - kapanışlar eğlencelidir, ama kafa karıştırıcıdır.

+0

'daki kapanışlara da iyi bir giriş niteliğindedir. anlamama yardım et. Teşekkürler. –

+0

Hey teşekkürler Roma, bu kesinlikle yardımcı oldu. Şimdi bana çok açık. Apple'ın açıklaması ilk denemeye başlamak için biraz dikti. –

+0

Çok teşekkür ederim! Bu kod snippet'inin nasıl çalıştığını anlamamda gerçekten yardımcı oldu. –

1

aradığınız işlevi parametre olarak bir kapatma alır: işlevine verilen

numbers.map({...}) 

kapatma size denilen işlevi tarafından yürütüldüğünde bir parametre alması bekleniyor. Bu parametre kapanması tanımlanır:

(number: Int) -> Int in 

Artık parametreyi kullanabilir Bir kapak sadece parametrelerle bir fonksiyon parantez içine taşınır kapatılması

let result = 3 * number 
    return result 
0

Kapanışlar, kodunuzdan geçirilip kullanılabilecek bağımsız işlev bloklarıdır.

dizimi:

{(parameterName: ParameterType) -> returnType in 
    //Statements 
} 

Pratik Senaryo: Kullanıcı Filtreyi uygulamak istediğiniz ve 300'den fazla (bu durumda) olan değerlerini seçmek istediğinizde bu başarmak için kapanışları kullanabilirsiniz. Kodun altında Dan

var elements: [Int] = [Int]() //Declaring Empty array 
elements = [1001, 999, 555, 786, 988, 322, 433, 128, 233, 222, 201, 276, 133] 

var filteredElements = elements.map({(num: Int) -> Int? in 
    return num > 300 ? num : nil 
}) 

output: 
[Optional(1001), Optional(999), Optional(555), Optional(786), Optional(988), Optional(322), Optional(433), nil, nil, nil, nil, nil, nil] 

açıkça biz() fonksiyonu elements.map için kapatma geçiyoruz görebilirsiniz.

Kapanış:

{(num: Int) -> Int? in 
     return num > 300 ? num : nil 
    } 

(num:Int) parametredir. Int? İsteğe Bağlı Tamsayı Türü'ne döneceğiz.

in sonrasında logicinizi yazabiliriz.

Kapatma here hakkında daha fazla bilgi edinebilirsiniz.