Jump to content

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

Recommended Posts

Очекивао сам једно питање у вези овога... :)

 

Које? 'Range' враћа 'IEnumerable<int>' на коме онда зовеш 'Where' да га просејеш кроз предикат и на крају зовеш 'Sum' да сабереш. Пропуштам ли нешто?

Share this post


Link to post
Share on other sites

Зависи. :)

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.

 

Da, tačno, trebalo je biti precizniji pošto je ipak reč o swift-u

To je ipak wrap-ovan null, eksplicitno unwrapped optional nema proveru, pokušava da radi sa null i zato puca.

 

@@Grizzly Adams

 

Swift je tako koncipiran da očekuje da referenca uvek ima vrednost, da bude inicijalizovana, ili pri deklaraciji, ili u konstruktoru. Ukoliko to ne može da se ispuni, odnosno varijabla može i da nema vrednost, onda ona mora da se deklariše kao optional. To je ništa drugo do običan wrapper, koji, umesto da uzrokuje crash kada je varijabla null, ume da ,,elegantno vrati null" i nastavi dalje.

Share this post


Link to post
Share on other sites

Које? 'Range' враћа 'IEnumerable<int>' на коме онда зовеш 'Where' да га просејеш кроз предикат и на крају зовеш 'Sum' да сабереш. Пропуштам ли нешто?

 

Да ли се кроз низ пролази једном или два пута?

Share this post


Link to post
Share on other sites

Трик је у linq методама (које су у ствари екстензије за IEnumerable) и које користе механизам "deferred execution". То омогућава низу linq позива да се надовезују један на други кроз једну итерацију.

 

То значи да би:

enum.Where(a => a > 0).Where(a => a % 4 ==0)

било еквивалентно једном пролазу кроз низ/листу, са условом (a > 0 && a % 4 ==0), а не више пролаза. Што је баш моћно...

 

Чак и ако направиш један linq упит па га после додатно филтрираш важи исто.

Share this post


Link to post
Share on other sites

Трик је у linq методама (које су у ствари екстензије за IEnumerable) и које користе механизам "deferred execution". То омогућава низу linq позива да се надовезују један на други кроз једну итерацију.

 

То значи да би:

enum.Where(a => a > 0).Where(a => a % 4 ==0)

било еквивалентно једном пролазу кроз низ/листу, са условом (a > 0 && a % 4 ==0), а не више пролаза. Што је баш моћно...

 

Чак и ако направиш један linq упит па га после додатно филтрираш важи исто.

 

Тако Haskell увек ради. За Swift су решили да буду експлицитни са лењошћу (од скора, у ранијим бетама је било мало другачије).

let hardworkingSum = Array(1...10)
    .filter { println("calling predicate..."); return $0 * $0 % 4 == 0}
    .reduce(0) { println("combining...") ; return $0 + $1 }

// Dva puta prolazi kroz niz.
calling predicate...
calling predicate...
calling predicate...
calling predicate...
calling predicate...
calling predicate...
calling predicate...
calling predicate...
calling predicate...
calling predicate...
combining...
combining...
combining...
combining...
combining...
// Proširujemo LazySequence da ne bismo morali da zovemo globalnu reduce funkciju
extension LazySequence {
    func reduce<U>(initial: U, combine: (U, S.Generator.Element) -> U) -> U {
        return Swift.reduce(self, initial, combine)
    }
}

let lazySum  = lazy(Array(1...10))
    .filter { println("calling predicate..."); return $0 * $0 % 4 == 0 }
    .reduce(0) { println("combining...") ; return $0 + $1 }

// Samo jednom prolazi kroz niz.
calling predicate...
calling predicate...
combining...
calling predicate...
calling predicate...
combining...
calling predicate...
calling predicate...
combining...
calling predicate...
calling predicate...
combining...
calling predicate...
calling predicate...
combining...

Share this post


Link to post
Share on other sites

@@Grizzly Adams

 

Swift je tako koncipiran da očekuje da referenca uvek ima vrednost, da bude inicijalizovana, ili pri deklaraciji, ili u konstruktoru. Ukoliko to ne može da se ispuni, odnosno varijabla može i da nema vrednost, onda ona mora da se deklariše kao optional. To je ništa drugo do običan wrapper, koji, umesto da uzrokuje crash kada je varijabla null, ume da ,,elegantno vrati null" i nastavi dalje.

 

Да, то је у ствари обичан enum са придруженом вредношћу у случају  'Some', нешто као 'Maybe' у Haskell- у (чак су поменули Haskell у коментару).

enum Optional<T> : Reflectable, NilLiteralConvertible {
    case None
    case Some(T)
    init()
    init(_ some: T)
    var hasValue: Bool { get }

    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> MirrorType
    static func convertFromNilLiteral() -> T?
}

Могуће га је користити и овако незаслађеног, што може да буде корисно кад се ради pattern matching са више optional-a.

extension String {
    
    func isValid() -> Bool {
        return true
    }
    
    func transform() -> String {
        return "transformed string"
    }
}

func transformString(string: String) -> Optional<String> {
    if string.isValid() {
        return .Some(string.transform())
    } else {
        return .None
    }
}

switch transformString("bla bla") {
case .Some(let transformedString):
    println(transformedString)
case .None:
    println("BUMMER!")
}

switch (transformString("bla bla"), transformString("truc")) {
case (.Some(let transformedBla), .Some(let transformedTruc)):
    println(transformedBla + transformedTruc)
default:
    println("BUMMER!")
}

 

 

Share this post


Link to post
Share on other sites

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

I jel vredi da se sad kupi ovaj novi model kojeg su upravo izbacili? Ili je bolje cekati do 2015? Takodje cuo sam da i ovaj Yosemite bice besplatan kao upgrade, ali nisam siguran?

Share this post


Link to post
Share on other sites

I jel vredi da se sad kupi ovaj novi model kojeg su upravo izbacili? Ili je bolje cekati do 2015? Takodje cuo sam da i ovaj Yosemite bice besplatan kao upgrade, ali nisam siguran?

Pa sta da cekas svaki im je odlican...

Ja sam 2009 kupio macbook pro i sljaka odlicno. Sada je u servisu jer je poceo da se cuje ventilator ... I to je sve. Nije sada super brz kao pre 5 godina ali sljaka bez problema. Razmisljam samo da ga otvorim i zamenim hard disk sa nekim SSD i to bi ga verujem malo ubrzalo . I uopste ne razmisljam o kupovini necega u naredne 2-3 godine ...

Tako da kada ga kupis miran si ...

A OS im je gratis ili kosta nesto tipa 10-15€

Share this post


Link to post
Share on other sites

Takodje cuo sam da i ovaj Yosemite bice besplatan kao upgrade, ali nisam siguran?

 

Upgrade је од прошле године, па до даљњег, бесплатан. С тим што мораш да имаш налоg на App Store-у. Ту имаш две могућности. Да набавиш картицу (која ти треба за идентификацију, чак и ако ништа не купујеш, већ скидаш бесплатне ствари) неке од земаља које имају App Store (Албанија, Чад, Танзанија...) или да користиш српску картицу, и направиш налог на хрватској продавници користећи лажну хрватску адресу. Мислим да тако већина људи овде ради. Скоро сам сигуран да је Apple намерно оставио ово последње (недокументовано) решење да ради код нас.

Share this post


Link to post
Share on other sites

Придружите се разговору

Можете одговорити сада, а касније да се региструјете на Поуке.орг Ако имате налог, пријавите се сада да бисте објавили на свом налогу.

Guest
Имаш нешто да додаш? Одговори на ову тему

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Све поруке на форуму, осим званичних саопштења Српске Православне Цркве, су искључиво лична мишљења чланова форума 'Живе Речи Утехе' и уредништво не сноси никакву материјалну и кривичну одговорност услед погрешних информација. Објављивање информација са сајта у некомерцијалне сврхе могуће је само уз навођење URL адресе дискусије. За све друге видове дистрибуције потребно је имати изричиту дозволу администратора Поука.орг и/или аутора порука.  Коментари се на сајту Поуке.орг објављују у реалном времену и Администрација се не може сматрати одговорним за написано.  Забрањен је говор мржње, псовање, вређање и клеветање. Такав садржај ће бити избрисан чим буде примећен, а аутори могу бити пријављени надлежним институцијама. Чланови имају опцију пријављивања недоличних порука, те непримерен садржај могу пријавити Администрацији. Такође, ако имате проблема са регистрацијом или заборављеном шифром за сајтове Поуке.орг и Црква.нет, пошаљите нам поруку у контакт форми да Вам помогнемо у решавању проблема.

×
×
  • Create New...