Jump to content

WWDC 14

Оцени ову тему


Препоручена порука

То ради исто што и ово. 

let result = reduce(1...100, 0) {
    (result: Int, currentElement: Int) -> Int in
    if (currentElement * currentElement) % 4 == 0 {
        return result + currentElement
    } else {
        return result
    }
}

Кад мало боље размислим, еквивалент овог изнад је заправо:

let result = reduce(1...100, 0) {
     ($1 * $1) % 4 == 0 ? $0 + $1 : $0
}

Едитовао сам већ и пре него што одговориш, јер је сигурно боље од претходне варијанте са нулом. Онда не враћамо нулу, него или досадашњи резултат, или досадашњи резултат + тренутни број,  ако број задовољи услов. Да ли је то довољно добро или мислиш да ипак треба одрадити у два корака:

let filtered = filter(1...100) { 
    ($0 * $0) % 4 == 0 
}

let sum = reduce(filtered, 0) { 
    $0 + $1 
}

Али онда два пута пролазимо кроз низ (тј. кроз једном кроз оригинални низ и једном кроз краћи, филтрирани), што може бити незгодно ако имамо (1...1000000) или тако нешто.

Link to comment
Подели на овим сајтовима

Што рече Knuth: "Premature optimization is the root of all evil"... :)
 

let result = reduce(1...100, 0) {
     ($1 * $1) % 4 == 0 ? $0 + $1 : $0
}

Мислим да је ово најбоље. Фора је у томе што овде имаш "мустру" тј. патерн који се понавља у пуно комплекснијим ситуацијама када пролазиш кроз низ објеката и над сваким обављаш операцију да би добио агрегатни резултат. И онда "подметање нул објекта" може да има непредвиђене сајд-ефекте, посебно када после модификујеш класе, а такви багови се по правилу тешко проналазе.
 
Оћу да кажем да није само "чистунство" него стварно има оправдање.

  • Волим 1

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

Што рече Knuth: "Premature optimization is the root of all evil"... :)

 

let result = reduce(1...100, 0) {
     ($1 * $1) % 4 == 0 ? $0 + $1 : $0
}
Мислим да је ово најбоље. Фора је у томе што овде имаш "мустру" тј. патерн који се понавља у пуно комплекснијим ситуацијама када пролазиш кроз низ објеката и над сваким обављаш операцију да би добио агрегатни резултат. И онда "подметање нул објекта" може да има непредвиђене сајд-ефекте, посебно када после модификујеш класе, а такви багови се по правилу тешко проналазе.

 

Оћу да кажем да није само "чистунство" него стварно има оправдање.

 

 

Па да, оно са нулом сам био баш одвалио. Да сам написао нулу у пуној if/else конструкцији, одмах бих видео  каква је глупост у питању. :)

Link to comment
Подели на овим сајтовима

У овом примеру није велика одвала, али за неки сложенији може да буде. Мада стварно кад се напише као цео if/else изгледа необично... :)

 

Овако је елегантније.

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

Zna li neko od vas da li ce izaci neki novi MacBook Pro ove godine, sa obzirom sto su ga apdejtirali pre neki dan? Ali dizajn i specifikacije nisu se puno promenili...

Svake godine izbacuju nov ... Sada ce , u narednom mesecima ... Do bozica oni sve to renoviraju ...

Svaka čast Vučiću! Spasio si Srbiju iz ruku lopova i društvenih parazita! 

Link to comment
Подели на овим сајтовима

I koliko to kosta, ako ima da se kupi u Srbiji?

Ima da se kupi ali je skuplje bar 500 evra. Bolje je sjesti na wizair i sprziti do Bazela na jednu noc. Kupis tamo za 1750 evra, i od povrata poreza jedno 5-7% pokrijes avionsku kartu, i platis samo nocenje i malo procunjas gradom. :)

Српски менталитет карактеришу изненадни подвизи кратког даха, понесеност која прво улије наду, али капитулира у завршници, све се то после правда вишом силом и некаквом планетарном неправдом што само на нас вреба.

Link to comment
Подели на овим сајтовима

Решио сам да пробам мало да пискарам и ево га први текстић о Swift-у.

 

https://medium.com/@ivicamil/higher-order-functions-in-swift-part-1-d8e75f963d13

 

super ti je ovo :)

Link to comment
Подели на овим сајтовима

Што рече Knuth: "Premature optimization is the root of all evil"... :)

 

let result = reduce(1...100, 0) {
     ($1 * $1) % 4 == 0 ? $0 + $1 : $0
}

Мислим да је ово најбоље. Фора је у томе што овде имаш "мустру" тј. патерн који се понавља у пуно комплекснијим ситуацијама када пролазиш кроз низ објеката и над сваким обављаш операцију да би добио агрегатни резултат. И онда "подметање нул објекта" може да има непредвиђене сајд-ефекте, посебно када после модификујеш класе, а такви багови се по правилу тешко проналазе.

 

Оћу да кажем да није само "чистунство" него стварно има оправдање.

 

čisto diskusije radi, razmišljam na glas:

 

Slažem se sa primedbom. Ali što se tiče onog closure-a gore, on samo deluje kao generički kod, a u stvari nije. To je funkcija koja ima dva Int parametra, i u punom zapisu bi izgledala ovako nekako:

func nekiNaziv(arg1: Int, arg2: Int) -> Int {
    return (arg1 * arg2) % 4 == 0 ? arg1 + arg1 : arg1
}

Onaj kraći zapis je samo syntactic sugar. I s obzirom da se radi sa integer-ima, nema nikakve veze i ako se sabira nula (iako je nepotrebno). Imalo bi efekta na nekom ogromnom data set-u, ali u tom slučaju svakako ne bi koristio ovu (semi)funkcionalnu paradigmu, već bi pazio na kompleksnost.

Ovaj closure nije reusable, jer se definiše na licu mesta, za nešto što ti samo tu treba i nigde više se ne koristi.

Ne može ni da bude generic zato što pretpostavlja postojanje četiri operatora: *, %, == i +. Da bi postao generic: 1. njegovi parametri bi morali da budu deklarisani kao pripadnici interfejsa koji međusobno implementiraju ove operatore, ili 2. da očekuje da se operatori proslede kao parametri (kao što to generički reduce očekuje).

 

U objc-u se preko null prelazilo bez problema, jednostavno poziv metode na null referenci ne uradi ništa. U swift-u ti pukne bad access pa gledaj šta ćeš :)

 

Tako nekako :)

Link to comment
Подели на овим сајтовима

U objc-u se preko null prelazilo bez problema, jednostavno poziv metode na null referenci ne uradi ništa. U swift-u ti pukne bad access pa gledaj šta ćeš :)

 

Зависи. :)

class SomeClass {
    
    func doSomething() {
        
    }
}

class TestClass {
    
    var optionalProperty: SomeClass?
}

let test = TestClass()
test.optionalProperty.doSomething() // Ovo se neće kompajlirati.
test.optionalProperty!.doSomething() // Ovo će eksplodirati.
test.optionalProperty?.doSomething() // Ovo jednostavno ne radi ništa ako je optionalProperty == nil, slično kao u Obj-C.
Link to comment
Подели на овим сајтовима

  • Чланови који сада читају   0 чланова

    • Нема регистрованих чланова који гледају ову страницу
×
×
  • Креирај ново...