Konečně jsem se dostal k instalaci Xcode 6. Takže tady pár dalších dojmů:
„Trailing closure“ se ukazuje jako hezká syntaktická vlastnost (přeskupení závorek). Navíc není pravda, jak nesmyslně zaznělo v minulé diskusi, že by zavádělo víceznačnou syntax. Překladač si s případným překlepem hravě poradí.
Nejvíc mě zajímalo, jak se řeší provázání s ObjC. Xcode umí samo vytvořit „přemosťovací“ hlavičkový soubor, takže žádný glue kód není potřeba. Vzhledem ke společnému runtimu vše funguje hladce, jen pojmenování metod z ObjC do Swiftu nezapadá. Nicméně zvyknout se na to dá.
Co se týče správy paměti, je už zcela transparentní (žádné explicitní @autoreleasepool). Překladač počítání referencí agresivně optimalizuje, takže pokud to není nezbytně nutné, nic se nepočítá (neaktualizuje se čítač referencí). V typickém příkladu referenčního cyklu, kdy se v callbacku používá „self“, překladač automaticky přidá „weak“, takže k žádnému leaku nedojde (tak tomu ovšem je v ObjC už dlouho). Zkušený programátor si sotva může přát něco lepšího.
Jak už jsem psal minule, u uzávěrů překladač automaticky rozhodne o vhodném způsobu zkopírování proměnných (což žádný dnes rozšířený jazyk nedělá).
var callbacks = ArrayVoid)>()
var j = 0
for i in 1...5 { callbacks.append({ println("\(i) \(j++)") }) }
for callback in callbacks { callback() }
Nevím ale, jestli to lze určit explicitně (jako v C++ [i,&j]
). Každopádně je to lepší než v Javě, o C# ani nemluvě, tam to je fakt na zabití.
Na syntax je třeba si zvyknout, není dobrá ani špatná, pěkná ani ošklivá, prostě je jiná. Nadmíru užitečná je automatická inference typů, jež tolik chybí Javě (i když ve Swiftu ještě místy hapruje).
"Na syntax je třeba si zvyknout, není dobrá ani špatná, pěkná ani ošklivá, prostě je jiná." – tesat do kamene.
Bohužel spoustu programátorů (i skvělých a vynikajících) jsou konzervy, kteří nejsou s to se povznést nad syntaxi jazyka a nahlédnout pod jinou pokličku než hrnce, který vaří Microsoft. A pro ně bude po zbytek života prostě ObjC nechutné a hnusné a počítače od Apple klasicky předražené.
„Navíc není pravda, jak nesmyslně zaznělo v minulé diskusi, že by zavádělo víceznačnou syntax. Překladač si s případným překlepem hravě poradí.“
Jak si poradí s tím, kdy mezi ) a { vložíte konec řádku? Podle manuálu by se tím z trailing closure měla vyrobit samostatná closure, to by mělo jít zkompilovat, a že to dělá něco úplně jiného, se pozná až za běhu.
„u uzávěrů překladač automaticky rozhodne o vhodném způsobu zkopírování proměnných (což žádný dnes rozšířený jazyk nedělá).“
Co jsem vyčetl v refernci, tak Swift akorát dělá to samé co [&] v C++ s tím rozdílem, že ve Swiftu už z podstaty fungování nejsou proměnné omezené scope, ale počítáním referencí. Dost podobně fungují generátory v Pythonu.
„Nevím ale, jestli to lze určit explicitně (jako v C++ [i,&j])“
V refernci možnost předávat parametry hodnotou není uvedena, takže pravděpodobně ne.
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 198×
Přečteno 25 361×
Přečteno 23 793×
Přečteno 20 177×
Přečteno 17 872×