summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--c++.html.markdown18
-rw-r--r--dart.html.markdown2
-rw-r--r--elixir.html.markdown2
-rw-r--r--fi-fi/go-fi.html.markdown441
-rw-r--r--fr-fr/markdown.html.markdown2
-rw-r--r--julia.html.markdown16
-rw-r--r--latex.html.markdown9
-rwxr-xr-xlatex.pdfbin0 -> 145946 bytes
-rw-r--r--markdown.html.markdown235
-rw-r--r--perl6.html.markdown29
-rw-r--r--python.html.markdown4
-rw-r--r--python3.html.markdown2
-rw-r--r--swift.html.markdown115
-rw-r--r--uk-ua/javascript-ua.html.markdown (renamed from ua-ua/javascript-ua.html.markdown)0
-rw-r--r--visualbasic.html.markdown96
-rw-r--r--yaml.html.markdown31
-rw-r--r--zh-cn/swift-cn.html.markdown131
17 files changed, 875 insertions, 258 deletions
diff --git a/c++.html.markdown b/c++.html.markdown
index d03092e5..6b452b1b 100644
--- a/c++.html.markdown
+++ b/c++.html.markdown
@@ -801,6 +801,24 @@ void doSomethingWithAFile(const std::string& filename)
// all automatically destroy their contents when they fall out of scope.
// - Mutexes using lock_guard and unique_lock
+// containers with object keys of non-primitive values (custom classes) require
+// compare function in the object itself or as a function pointer. Primitives
+// have default comparators, but you can override it.
+class Foo {
+public:
+ int j;
+ Foo(int a) : j(a) {}
+};
+struct compareFunction {
+ bool operator()(const Foo& a, const Foo& b) const {
+ return a.j < b.j;
+ }
+};
+//this isn't allowed (although it can vary depending on compiler)
+//std::map<Foo, int> fooMap;
+std::map<Foo, int, compareFunction> fooMap;
+fooMap[Foo(1)] = 1;
+fooMap.find(Foo(1)); //true
/////////////////////
// Fun stuff
diff --git a/dart.html.markdown b/dart.html.markdown
index f7601271..fc7b220e 100644
--- a/dart.html.markdown
+++ b/dart.html.markdown
@@ -498,7 +498,7 @@ main() {
## Further Reading
-Dart has a comprehenshive web-site. It covers API reference, tutorials, articles and more, including a
+Dart has a comprehensive web-site. It covers API reference, tutorials, articles and more, including a
useful Try Dart online.
http://www.dartlang.org/
http://try.dartlang.org/
diff --git a/elixir.html.markdown b/elixir.html.markdown
index eedeb227..720e080c 100644
--- a/elixir.html.markdown
+++ b/elixir.html.markdown
@@ -343,6 +343,7 @@ rescue
RuntimeError -> "rescued a runtime error"
_error -> "this will rescue any error"
end
+#=> "rescued a runtime error"
# All exceptions have a message
try do
@@ -351,6 +352,7 @@ rescue
x in [RuntimeError] ->
x.message
end
+#=> "some error"
## ---------------------------
## -- Concurrency
diff --git a/fi-fi/go-fi.html.markdown b/fi-fi/go-fi.html.markdown
new file mode 100644
index 00000000..9ed4e0d2
--- /dev/null
+++ b/fi-fi/go-fi.html.markdown
@@ -0,0 +1,441 @@
+---
+name: Go
+category: language
+language: Go
+filename: learngo-fi.go
+contributors:
+ - ["Sonia Keys", "https://github.com/soniakeys"]
+ - ["Christopher Bess", "https://github.com/cbess"]
+ - ["Jesse Johnson", "https://github.com/holocronweaver"]
+ - ["Quint Guvernator", "https://github.com/qguv"]
+ - ["Jose Donizetti", "https://github.com/josedonizetti"]
+ - ["Alexej Friesen", "https://github.com/heyalexej"]
+ - ["Clayton Walker", "https://github.com/cwalk"]
+translators:
+ - ["Timo Virkkunen", "https://github.com/ComSecNinja"]
+lang: fi-fi
+---
+
+Go luotiin työn tekemistä varten. Se ei ole tietojenkäsittelyn uusin trendi,
+mutta se on uusin nopein tapa ratkaista oikean maailman ongelmia.
+
+Sillä on staattisesti tyypitetyistä imperatiivisista kielistä tuttuja
+konsepteja. Se kääntyy ja suorittuu nopeasti, lisää helposti käsitettävän
+samanaikaisten komentojen suorittamisen nykyaikaisten moniytimisten
+prosessoreiden hyödyntämiseksi ja antaa käyttäjälle ominaisuuksia suurten
+projektien käsittelemiseksi.
+
+Go tuo mukanaan loistavan oletuskirjaston sekä innokkaan yhteisön.
+
+```go
+// Yhden rivin kommentti
+/* Useamman
+ rivin kommentti */
+
+// Package -lausekkeella aloitetaan jokainen lähdekooditiedosto.
+// Main on erityinen nimi joka ilmoittaa
+// suoritettavan tiedoston kirjaston sijasta.
+package main
+
+// Import -lauseke ilmoittaa tässä tiedostossa käytetyt kirjastot.
+import (
+ "fmt" // Paketti Go:n oletuskirjastosta.
+ "io/ioutil" // Implementoi hyödyllisiä I/O -funktioita.
+ m "math" // Matematiikkakirjasto jolla on paikallinen nimi m.
+ "net/http" // Kyllä, web-palvelin!
+ "strconv" // Kirjainjonojen muuntajia.
+)
+
+// Funktion määrittelijä. Main on erityinen: se on ohjelman suorittamisen
+// aloittamisen alkupiste. Rakasta tai vihaa sitä, Go käyttää aaltosulkeita.
+func main() {
+ // Println tulostaa rivin stdoutiin.
+ // Se tulee paketin fmt mukana, joten paketin nimi on mainittava.
+ fmt.Println("Hei maailma!")
+
+ // Kutsu toista funktiota tämän paketin sisällä.
+ beyondHello()
+}
+
+// Funktioilla voi olla parametrejä sulkeissa.
+// Vaikkei parametrejä olisikaan, sulkeet ovat silti pakolliset.
+func beyondHello() {
+ var x int // Muuttujan ilmoittaminen: ne täytyy ilmoittaa ennen käyttöä.
+ x = 3 // Arvon antaminen muuttujalle.
+ // "Lyhyet" ilmoitukset käyttävät := joka päättelee tyypin, ilmoittaa
+ // sekä antaa arvon muuttujalle.
+ y := 4
+ sum, prod := learnMultiple(x, y) // Funktio palauttaa kaksi arvoa.
+ fmt.Println("summa:", sum, "tulo:", prod) // Yksinkertainen tuloste.
+ learnTypes() // < y minuuttia, opi lisää!
+}
+
+/* <- usean rivin kommentti
+Funktioilla voi olla parametrejä ja (useita!) palautusarvoja.
+Tässä `x`, `y` ovat argumenttejä ja `sum`, `prod` ovat ne, mitä palautetaan.
+Huomaa että `x` ja `sum` saavat tyyin `int`.
+*/
+func learnMultiple(x, y int) (sum, prod int) {
+ return x + y, x * y // Palauta kaksi arvoa.
+}
+
+// Sisäänrakennettuja tyyppejä ja todellisarvoja.
+func learnTypes() {
+ // Lyhyt ilmoitus antaa yleensä haluamasi.
+ str := "Opi Go!" // merkkijonotyyppi.
+
+ s2 := `"raaka" todellisarvoinen merrkijono
+voi sisältää rivinvaihtoja.` // Sama merkkijonotyyppi.
+
+ // Ei-ASCII todellisarvo. Go-lähdekoodi on UTF-8.
+ g := 'Σ' // riimutyyppi, lempinimi int32:lle, sisältää unicode-koodipisteen.
+
+ f := 3.14195 //float64, IEEE-754 64-bittinen liukuluku.
+ c := 3 + 4i // complex128, sisäisesti ilmaistu kahdella float64:lla.
+
+ // var -syntaksi alkuarvoilla.
+ var u uint = 7 // Etumerkitön, toteutus riippuvainen koosta kuten int.
+ var pi float32 = 22. / 7
+
+ // Muuntosyntaksi lyhyellä ilmoituksella.
+ n := byte('\n') // byte on leminimi uint8:lle.
+
+ // Listoilla on kiinteä koko kääntöhetkellä.
+ var a4 [4]int // 4 int:in lista, alkiot ovat alustettu nolliksi.
+ a3 := [...]int{3, 1, 5} // Listan alustaja jonka kiinteäksi kooksi tulee 3
+ // alkiota, jotka saavat arvot 3, 1, ja 5.
+
+ // Siivuilla on muuttuva koko. Sekä listoilla että siivuilla on puolensa,
+ // mutta siivut ovat yleisempiä käyttötapojensa vuoksi.
+ s3 := []int{4, 5, 9} // Vertaa a3: ei sananheittoa (...).
+ s4 := make([]int, 4) // Varaa 4 int:n siivun, alkiot alustettu nolliksi.
+ var d2 [][]float64 // Vain ilmoitus, muistia ei varata.
+ bs := []byte("a slice") // Tyypinmuuntosyntaksi.
+
+ // Koska siivut ovat dynaamisia, niitä voidaan yhdistellä sellaisinaan.
+ // Lisätäksesi alkioita siivuun, käytä sisäänrakennettua append()-funktiota.
+ // Ensimmäinen argumentti on siivu, johon alkoita lisätään.
+ s := []int{1, 2, 3} // Tuloksena on kolmen alkion pituinen lista.
+ s = append(s, 4, 5, 6) // Lisätty kolme alkiota. Siivun pituudeksi tulee 6.
+ fmt.Println(s) // Päivitetty siivu on nyt [1 2 3 4 5 6]
+
+ // Lisätäksesi siivun toiseen voit antaa append-funktiolle referenssin
+ // siivuun tai todellisarvoiseen siivuun lisäämällä sanaheiton argumentin
+ // perään. Tämä tapa purkaa siivun alkiot ja lisää ne siivuun s.
+ s = append(s, []int{7, 8, 9}...) // 2. argumentti on todellisarvoinen siivu.
+ fmt.Println(s) // Päivitetty siivu on nyt [1 2 3 4 5 6 7 8 9]
+
+ p, q := learnMemory() // Ilmoittaa p ja q olevan tyyppiä osoittaja int:iin.
+ fmt.Println(*p, *q) // * seuraa osoittajaa. Tämä tulostaa kaksi int:ä.
+
+ // Kartat ovat dynaamisesti kasvavia assosiatiivisia listoja, kuten hash tai
+ // dictionary toisissa kielissä.
+ m := map[string]int{"three": 3, "four": 4}
+ m["one"] = 1
+
+ // Käyttämättömät muuttujat ovat virheitä Go:ssa.
+ // Alaviiva antaa sinun "käyttää" muuttujan mutta hylätä sen arvon.
+ _, _, _, _, _, _, _, _, _, _ = str, s2, g, f, u, pi, n, a3, s4, bs
+ // Tulostaminen tietysti lasketaan muuttujan käyttämiseksi.
+ fmt.Println(s, c, a4, s3, d2, m)
+
+ learnFlowControl() // Takaisin flowiin.
+}
+
+// Go:ssa on useista muista kielistä poiketen mahdollista käyttää nimettyjä
+// palautusarvoja.
+// Nimen antaminen palautettavan arvon tyypille funktion ilmoitusrivillä
+// mahdollistaa helpon palaamisen useasta eri funktion suorituskohdasta sekä
+// pelkän return-lausekkeen käytön ilman muita mainintoja.
+func learnNamedReturns(x, y int) (z int) {
+ z = x * y
+ return // z on epäsuorasti tässä, koska nimesimme sen aiemmin.
+}
+
+// Go kerää kaikki roskansa. Siinä on osoittajia mutta ei niiden laskentoa.
+// Voit tehdä virheen mitättömällä osoittajalla, mutta et
+// kasvattamalla osoittajaa.
+func learnMemory() (p, q *int) {
+ // Nimetyillä palautusarvoilla p ja q on tyyppi osoittaja int:iin.
+ p = new(int) // Sisäänrakennettu funktio new varaa muistia.
+ // Varattu int on alustettu nollaksi, p ei ole enää mitätön.
+ s := make([]int, 20) // Varaa 20 int:ä yhteen kohtaan muistissa.
+ s[3] = 7 // Anna yhdelle niistä arvo.
+ r := -2 // Ilmoita toinen paikallinen muuttuja.
+ return &s[3], &r // & ottaa asian osoitteen muistissa.
+}
+
+func expensiveComputation() float64 {
+ return m.Exp(10)
+}
+
+func learnFlowControl() {
+ // If -lausekkeet vaativat aaltosulkeet mutta ei tavallisia sulkeita.
+ if true {
+ fmt.Println("mitä mä sanoin")
+ }
+ // Muotoilu on standardoitu käyttämällä komentorivin komentoa "go fmt".
+ if false {
+ // Nyrpistys.
+ } else {
+ // Nautinto.
+ }
+ // Käytä switch -lauseketta ketjutettujen if -lausekkeiden sijasta.
+ x := 42.0
+ switch x {
+ case 0:
+ case 1:
+ case 42:
+ // Tapaukset eivät "tipu läpi".
+ /*
+ Kuitenkin meillä on erikseen `fallthrough` -avainsana. Katso:
+ https://github.com/golang/go/wiki/Switch#fall-through
+ */
+ case 43:
+ // Saavuttamaton.
+ default:
+ // Oletustapaus (default) on valinnainen.
+ }
+ // Kuten if, for -lauseke ei myöskään käytä tavallisia sulkeita.
+ // for- ja if- lausekkeissa ilmoitetut muuttujat ovat paikallisia niiden
+ // piireissä.
+ for x := 0; x < 3; x++ { // ++ on lauseke. Sama kuin "x = x + 1".
+ fmt.Println("iteraatio", x)
+ }
+ // x == 42 tässä.
+
+ // For on kielen ainoa silmukkalauseke mutta sillä on vaihtoehtosia muotoja.
+ for { // Päättymätön silmukka.
+ break // Kunhan vitsailin.
+ continue // Saavuttamaton.
+ }
+
+ // Voit käyttää range -lauseketta iteroidaksesi listojen, siivujen, merkki-
+ // jonojen, karttojen tai kanavien läpi. range palauttaa yhden (kanava) tai
+ // kaksi arvoa (lista, siivu, merkkijono ja kartta).
+ for key, value := range map[string]int{"yksi": 1, "kaksi": 2, "kolme": 3} {
+ // jokaista kartan paria kohden, tulosta avain ja arvo
+ fmt.Printf("avain=%s, arvo=%d\n", key, value)
+ }
+
+ // Kuten for -lausekkeessa := if -lausekkeessa tarkoittaa ilmoittamista ja
+ // arvon asettamista.
+ // Aseta ensin y, sitten testaa onko y > x.
+ if y := expensiveComputation(); y > x {
+ x = y
+ }
+ // Todellisarvoiset funktiot ovat sulkeumia.
+ xBig := func() bool {
+ return x > 10000 // Viittaa ylempänä ilmoitettuun x:ään.
+ }
+ fmt.Println("xBig:", xBig()) // tosi (viimeisin arvo on e^10).
+ x = 1.3e3 // Tämä tekee x == 1300
+ fmt.Println("xBig:", xBig()) // epätosi nyt.
+
+ // Lisäksi todellisarvoiset funktiot voidaan samalla sekä ilmoittaa että
+ // kutsua, jolloin niitä voidaan käyttää funtioiden argumentteina kunhan:
+ // a) todellisarvoinen funktio kutsutaan välittömästi (),
+ // b) palautettu tyyppi vastaa odotettua argumentin tyyppiä.
+ fmt.Println("Lisää ja tuplaa kaksi numeroa: ",
+ func(a, b int) int {
+ return (a + b) * 2
+ }(10, 2)) // Kutsuttu argumenteilla 10 ja 2
+ // => Lisää ja tuplaa kaksi numeroa: 24
+
+ // Kun tarvitset sitä, rakastat sitä.
+ goto love
+love:
+
+ learnFunctionFactory() // Funktioita palauttavat funktiot
+ learnDefer() // Nopea kiertoreitti tärkeään avainsanaan.
+ learnInterfaces() // Hyvää kamaa tulossa!
+}
+
+func learnFunctionFactory() {
+ // Seuraavat kaksi ovat vastaavia, mutta toinen on käytännöllisempi
+ fmt.Println(sentenceFactory("kesä")("Kaunis", "päivä!"))
+
+ d := sentenceFactory("kesä")
+ fmt.Println(d("Kaunis", "päivä!"))
+ fmt.Println(d("Laiska", "iltapäivä!"))
+}
+
+// Somisteet ovat yleisiä toisissa kielissä. Sama saavutetaan Go:ssa käyttämällä
+// todellisarvoisia funktioita jotka ottavat vastaan argumentteja.
+func sentenceFactory(mystring string) func(before, after string) string {
+ return func(before, after string) string {
+ return fmt.Sprintf("%s %s %s", before, mystring, after) // uusi jono
+ }
+}
+
+func learnDefer() (ok bool) {
+ // Lykätyt lausekkeet suoritetaan juuri ennen funktiosta palaamista.
+ defer fmt.Println("lykätyt lausekkeet suorittuvat")
+ defer fmt.Println("käänteisessä järjestyksessä (LIFO).")
+ defer fmt.Println("\nTämä rivi tulostuu ensin, koska")
+ // Defer -lauseketta käytetään yleisesti tiedoston sulkemiseksi, jotta
+ // tiedoston sulkeva funktio pysyy lähellä sen avannutta funktiota.
+ return true
+}
+
+// Määrittele Stringer rajapintatyypiksi jolla on
+// yksi jäsenfunktio eli metodi, String.
+type Stringer interface {
+ String() string
+}
+
+// Määrittele pair rakenteeksi jossa on kaksi kenttää, x ja y tyyppiä int.
+type pair struct {
+ x, y int
+}
+
+// Määrittele jäsenfunktio pair:lle. Pair tyydyttää nyt Stringer -rajapinnan.
+func (p pair) String() string { // p:tä kutsutaan nimellä "receiver"
+ // Sprintf on toinen julkinen funktio paketissa fmt.
+ // Pistesyntaksilla viitataan P:n kenttiin.
+ return fmt.Sprintf("(%d, %d)", p.x, p.y)
+}
+
+func learnInterfaces() {
+ // Aaltosuljesyntaksi on "todellisarvoinen rakenne". Se todentuu alustetuksi
+ // rakenteeksi. := -syntaksi ilmoittaa ja alustaa p:n täksi rakenteeksi.
+ p := pair{3, 4}
+ fmt.Println(p.String()) // Kutsu p:n (tyyppiä pair) jäsenfunktiota String.
+ var i Stringer // Ilmoita i Stringer-rajapintatyypiksi.
+ i = p // Pätevä koska pair tyydyttää rajapinnan Stringer.
+ // Kutsu i:n (Stringer) jäsenfunktiota String. Tuloste on sama kuin yllä.
+ fmt.Println(i.String())
+
+ // Funktiot fmt-paketissa kutsuvat argumenttien String-jäsenfunktiota
+ // selvittääkseen onko niistä saatavilla tulostettavaa vastinetta.
+ fmt.Println(p) // Tuloste on sama kuin yllä. Println kutsuu String-metodia.
+ fmt.Println(i) // Tuloste on sama kuin yllä.
+
+ learnVariadicParams("loistavaa", "oppimista", "täällä!")
+}
+
+// Funktioilla voi olla muuttuva eli variteettinen
+// määrä argumentteja eli parametrejä.
+func learnVariadicParams(myStrings ...interface{}) {
+ // Iteroi jokaisen argumentin läpi.
+ // Tässä alaviivalla sivuutetaan argumenttilistan kunkin kohdan indeksi.
+ for _, param := range myStrings {
+ fmt.Println("param:", param)
+ }
+
+ // Luovuta variteettinen arvo variteettisena parametrinä.
+ fmt.Println("params:", fmt.Sprintln(myStrings...))
+
+ learnErrorHandling()
+}
+
+func learnErrorHandling() {
+ // "; ok" -muotoa käytetään selvittääksemme toimiko jokin vai ei.
+ m := map[int]string{3: "kolme", 4: "neljä"}
+ if x, ok := m[1]; !ok { // ok on epätosi koska 1 ei ole kartassa.
+ fmt.Println("ei ketään täällä")
+ } else {
+ fmt.Print(x) // x olisi arvo jos se olisi kartassa.
+ }
+ // Virhearvo voi kertoa muutakin ongelmasta.
+ if _, err := strconv.Atoi("ei-luku"); err != nil { // _ sivuuttaa arvon
+ // tulostaa strconv.ParseInt: parsing "ei-luku": invalid syntax
+ fmt.Println(err)
+ }
+ // Palaamme rajapintoihin hieman myöhemmin. Sillä välin,
+ learnConcurrency()
+}
+
+// c on kanava, samanaikaisturvallinen viestintäolio.
+func inc(i int, c chan int) {
+ c <- i + 1 // <- on "lähetysoperaattori" kun kanava on siitä vasemmalla.
+}
+
+// Käytämme inc -funktiota samanaikaiseen lukujen lisäämiseen.
+func learnConcurrency() {
+ // Sama make -funktio jota käytimme aikaisemmin siivun luomiseksi. Make
+ // varaa muistin ja alustaa siivut, kartat ja kanavat.
+ c := make(chan int)
+ // Aloita kolme samanaikaista gorutiinia (goroutine). Luvut kasvavat
+ // samanaikaisesti ja ehkäpä rinnakkain jos laite on kykenevä ja oikein
+ // määritelty. Kaikki kolme lähettävät samalle kanavalle.
+ go inc(0, c) // go -lauseke aloittaa uuden gorutiinin.
+ go inc(10, c)
+ go inc(-805, c)
+ // Lue kolme palautusarvoa kanavalta ja tulosta ne.
+ // Niiden saapumisjärjestystä ei voida taata!
+ // <- on "vastaanotto-operaattori" jos kanava on oikealla
+ fmt.Println(<-c, <-c, <-c)
+
+ cs := make(chan string) // Toinen kanava joka käsittelee merkkijonoja.
+ ccs := make(chan chan string) // Kanava joka käsittelee merkkijonokanavia.
+ go func() { c <- 84 }() // Aloita uusi gorutiini arvon lähettämiseksi.
+ go func() { cs <- "sanaa" }() // Uudestaan, mutta cs -kanava tällä kertaa.
+ // Select -lausekkeella on syntaksi kuten switch -lausekkeella mutta
+ // jokainen tapaus sisältää kanavaoperaation. Se valitsee satunnaisen
+ // tapauksen niistä kanavista, jotka ovat kommunikaatiovalmiita
+ select {
+ case i := <-c: // Vastaanotettu arvo voidaan antaa muuttujalle
+ fmt.Printf("se on %T", i)
+ case <-cs: // tai vastaanotettu arvo voidaan sivuuttaa.
+ fmt.Println("se on merkkijono")
+ case <-ccs: // Tyhjä kanava; ei valmis kommunikaatioon.
+ fmt.Println("ei tapahtunut.")
+ }
+ // Tässä vaiheessa arvo oli otettu joko c:ltä tai cs:ltä. Yksi kahdesta
+ // ylempänä aloitetusta gorutiinista on valmistunut, toinen pysyy tukossa.
+
+ learnWebProgramming() // Go tekee sitä. Sinäkin haluat tehdä sitä.
+}
+
+// Yksittäinen funktio http -paketista aloittaa web-palvelimen.
+func learnWebProgramming() {
+
+ // ListenAndServe:n ensimmäinen parametri on TCP-osoite, jota kuunnellaan.
+ // Toinen parametri on rajapinta, http.Handler.
+ go func() {
+ err := http.ListenAndServe(":8080", pair{})
+ fmt.Println(err) // älä sivuuta virheitä.
+ }()
+
+ requestServer()
+}
+
+// Tee pair:sta http.Handler implementoimalla sen ainoa metodi, ServeHTTP.
+func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ // Tarjoa dataa metodilla http.ResponseWriter.
+ w.Write([]byte("Opit Go:n Y minuutissa!"))
+}
+
+func requestServer() {
+ resp, err := http.Get("http://localhost:8080")
+ fmt.Println(err)
+ defer resp.Body.Close()
+ body, err := ioutil.ReadAll(resp.Body)
+ fmt.Printf("\nWeb-palvelin sanoo: `%s`", string(body))
+}
+```
+
+## Lisää luettavaa
+
+Go-tietämyksen alku ja juuri on sen [virallinen verkkosivu]()(http://golang.org/).
+Siellä voit seurata oppitunteja, askarrella vuorovaikutteisesti sekä lukea paljon.
+Kierroksen lisäksi [dokumentaatio](https://golang.org/doc/) pitää sisällään tietoa
+siistin Go-koodin kirjoittamisesta, pakettien ja komentojen käytöstä sekä julkaisuhistoriasta.
+
+Kielen määritelmä itsessään on suuresti suositeltavissa. Se on helppolukuinen ja
+yllättävän lyhyt (niissä määrin kuin kielimääritelmät nykypäivänä ovat.)
+
+Voit askarrella parissa kanssa [Go playgroundissa](https://play.golang.org/p/tnWMjr16Mm).
+Muuttele sitä ja aja se selaimestasi! Huomaa, että voit käyttää [https://play.golang.org](https://play.golang.org)
+[REPL:na](https://en.wikipedia.org/wiki/Read-eval-print_loop) testataksesi ja koodataksesi selaimessasi, ilman Go:n asentamista.
+
+Go:n opiskelijoiden lukulistalla on [oletuskirjaston lähdekoodi](http://golang.org/src/pkg/).
+Kattavasti dokumentoituna se antaa parhaan kuvan helppolukuisesta ja ymmärrettävästä Go-koodista,
+-tyylistä ja -tavoista. Voit klikata funktion nimeä [doukumentaatiossa](http://golang.org/pkg/) ja
+lähdekoodi tulee esille!
+
+Toinen loistava paikka oppia on [Go by example](https://gobyexample.com/).
+
+Go Mobile lisää tuen mobiilialustoille (Android ja iOS). Voit kirjoittaa pelkällä Go:lla natiiveja applikaatioita tai tehdä kirjaston joka sisältää sidoksia
+Go-paketista, jotka puolestaan voidaan kutsua Javasta (Android) ja Objective-C:stä (iOS). Katso [lisätietoja](https://github.com/golang/go/wiki/Mobile).
diff --git a/fr-fr/markdown.html.markdown b/fr-fr/markdown.html.markdown
index e5e7c73a..66f0efbe 100644
--- a/fr-fr/markdown.html.markdown
+++ b/fr-fr/markdown.html.markdown
@@ -2,7 +2,7 @@
language: markdown
contributors:
- ["Andrei Curelaru", "http://www.infinidad.fr"]
-filename: markdown.md
+filename: markdown-fr.md
lang: fr-fr
---
diff --git a/julia.html.markdown b/julia.html.markdown
index cba7cd45..ef3ea244 100644
--- a/julia.html.markdown
+++ b/julia.html.markdown
@@ -2,6 +2,7 @@
language: Julia
contributors:
- ["Leah Hanson", "http://leahhanson.us"]
+ - ["Pranit Bauva", "http://github.com/pranitbauva1997"]
filename: learnjulia.jl
---
@@ -102,6 +103,11 @@ false
# Printing is easy
println("I'm Julia. Nice to meet you!")
+# String can be compared lexicographically
+"good" > "bye" # => true
+"good" == "good" # => true
+"1 + 2 = 3" == "1 + 2 = $(1+2)" # => true
+
####################################################
## 2. Variables and Collections
####################################################
@@ -390,6 +396,14 @@ end
add(5, 6) # => 11 after printing out "x is 5 and y is 6"
+# Compact assignment of functions
+f_add(x, y) = x + y # => "f (generic function with 1 method)"
+f_add(3, 4) # => 7
+
+# Function can also return multiple values as tuple
+f(x, y) = x + y, x - y
+f(3, 4) # => (7, -1)
+
# You can define functions that take a variable number of
# positional arguments
function varargs(args...)
@@ -723,7 +737,7 @@ code_native(square_area, (Float64,))
# ret
#
# Note that julia will use floating point instructions if any of the
-# arguements are floats.
+# arguments are floats.
# Let's calculate the area of a circle
circle_area(r) = pi * r * r # circle_area (generic function with 1 method)
circle_area(5) # 78.53981633974483
diff --git a/latex.html.markdown b/latex.html.markdown
index 31231a70..e89d7e3b 100644
--- a/latex.html.markdown
+++ b/latex.html.markdown
@@ -227,6 +227,15 @@ format you defined in Step 1.
That's all for now!
+% Most often, you would want to have a references section in your document.
+% The easiest way to set this up would be by using the bibliography section
+\begin{thebibliography}{1}
+ % similar to other lists, the \bibitem command can be used to list items
+ % each entry can then be cited directly in the body of the text
+ \bibitem{latexwiki} The amazing LaTeX wikibook: {\em https://en.wikibooks.org/wiki/LaTeX}
+ \bibitem{latextutorial} An actual tutorial: {\em http://www.latex-tutorial.com}
+\end{thebibliography}
+
% end the document
\end{document}
```
diff --git a/latex.pdf b/latex.pdf
new file mode 100755
index 00000000..6cf5f378
--- /dev/null
+++ b/latex.pdf
Binary files differ
diff --git a/markdown.html.markdown b/markdown.html.markdown
index b956a5f2..8961c995 100644
--- a/markdown.html.markdown
+++ b/markdown.html.markdown
@@ -2,45 +2,63 @@
language: markdown
contributors:
- ["Dan Turkel", "http://danturkel.com/"]
+ - ["Jacob Ward", "http://github.com/JacobCWard/"]
filename: markdown.md
---
-Markdown was created by John Gruber in 2004. It's meant to be an easy to read and write syntax which converts easily to HTML (and now many other formats as well).
-
-Give me as much feedback as you want! / Feel free to fork and pull request!
+Markdown was created by John Gruber in 2004. It's meant to be an easy to read and write syntax which converts easily to HTML (and now many other formats as well).
+Markdown also varies in implementation from one parser to a next. This
+guide will attempt to clarify when features are universal or when they are
+specific to a certain parser.
+
+- [HTML Elements](#html-elements)
+- [Headings](#headings)
+- [Simple Text Styles](#simple-text-styles)
+- [Paragraphs](#paragraphs)
+- [Lists](#lists)
+- [Code blocks](#code-blocks)
+- [Horizontal rule](#horizontal-rule)
+- [Links](#links)
+- [Images](#images)
+- [Miscellany](#miscellany)
+
+## HTML Elements
+Markdown is a superset of HTML, so any HTML file is valid Markdown.
```markdown
-<!-- Markdown is a superset of HTML, so any HTML file is valid Markdown. This
-means we can use HTML elements in Markdown, such as the comment element, and
-they won't be affected by a markdown parser. However, if you create an HTML
-element in your markdown file, you cannot use markdown syntax within that
-element's contents. -->
+<!--This means we can use HTML elements in Markdown, such as the comment element,
+and they won't be affected by a markdown parser. However, if you create an HTML element
+in your markdown file, you cannot use markdown syntax within that element's contents.-->
+```
-<!-- Markdown also varies in implementation from one parser to a next. This
-guide will attempt to clarify when features are universal or when they are
-specific to a certain parser. -->
+## Headings
-<!-- Headings -->
-<!-- You can create HTML elements <h1> through <h6> easily by prepending the
-text you want to be in that element by a number of hashes (#). -->
+You can create HTML elements `<h1>` through `<h6>` easily by prepending the
+text you want to be in that element by a number of hashes (#).
+
+```markdown
# This is an <h1>
## This is an <h2>
### This is an <h3>
#### This is an <h4>
##### This is an <h5>
###### This is an <h6>
+```
+Markdown also provides us with two alternative ways of indicating h1 and h2.
-<!-- Markdown also provides us with two alternative ways of indicating h1 and h2. -->
+```markdown
This is an h1
=============
This is an h2
-------------
+```
+## Simple text styles
-<!-- Simple text styles -->
-<!-- Text can be easily styled as italic or bold using markdown. -->
+Text can be easily styled as italic or bold using markdown.
+```markdown
*This text is in italics.*
_And so is this text._
@@ -50,15 +68,20 @@ __And so is this text.__
***This text is in both.***
**_As is this!_**
*__And this!__*
+```
-<!-- In Github Flavored Markdown, which is used to render markdown files on
-Github, we also have strikethrough: -->
+In Github Flavored Markdown, which is used to render markdown files on
+Github, we also have strikethrough:
+```markdown
~~This text is rendered with strikethrough.~~
+```
+## Paragraphs
-<!-- Paragraphs are a one or multiple adjacent lines of text separated by one or
-multiple blank lines. -->
+Paragraphs are a one or multiple adjacent lines of text separated by one or
+multiple blank lines.
+```markdown
This is a paragraph. I'm typing in a paragraph isn't this fun?
Now I'm in paragraph 2.
@@ -66,16 +89,20 @@ I'm still in paragraph 2 too!
I'm in paragraph three!
+```
-<!-- Should you ever want to insert an HTML <br /> tag, you can end a paragraph
-with two or more spaces and then begin a new paragraph. -->
+Should you ever want to insert an HTML <br /> tag, you can end a paragraph
+with two or more spaces and then begin a new paragraph.
+```markdown
I end with two spaces (highlight me to see them).
There's a <br /> above me!
+```
-<!-- Block quotes are easy and done with the > character. -->
+Block quotes are easy and done with the > character.
+```markdown
> This is a block quote. You can either
> manually wrap your lines and put a `>` before every line or you can let your lines get really long and wrap on their own.
> It doesn't make a difference so long as they start with a `>`.
@@ -84,9 +111,12 @@ There's a <br /> above me!
>> of indentation?
> How neat is that?
-<!-- Lists -->
-<!-- Unordered lists can be made using asterisks, pluses, or hyphens. -->
+```
+
+## Lists
+Unordered lists can be made using asterisks, pluses, or hyphens.
+```markdown
* Item
* Item
* Another item
@@ -102,159 +132,182 @@ or
- Item
- Item
- One last item
+```
+Ordered lists are done with a number followed by a period.
-<!-- Ordered lists are done with a number followed by a period. -->
-
+```markdown
1. Item one
2. Item two
3. Item three
+```
-<!-- You don't even have to label the items correctly and markdown will still
-render the numbers in order, but this may not be a good idea. -->
+You don't even have to label the items correctly and markdown will still
+render the numbers in order, but this may not be a good idea.
+```markdown
1. Item one
1. Item two
1. Item three
-<!-- (This renders the same as the above example) -->
-
-<!-- You can also use sublists. -->
+```
+(This renders the same as the above example)
+You can also use sublists
+```markdown
1. Item one
2. Item two
3. Item three
* Sub-item
* Sub-item
4. Item four
+```
-<!-- There are even task lists. This creates HTML checkboxes. -->
+There are even task lists. This creates HTML checkboxes.
+```markdown
Boxes below without the 'x' are unchecked HTML checkboxes.
- [ ] First task to complete.
- [ ] Second task that needs done
This checkbox below will be a checked HTML checkbox.
- [x] This task has been completed
+```
+
+## Code blocks
-<!-- Code blocks -->
-<!-- You can indicate a code block (which uses the <code> element) by indenting
-a line with four spaces or a tab. -->
+You can indicate a code block (which uses the `<code>` element) by indenting
+a line with four spaces or a tab.
+```markdown
This is code
So is this
+```
-<!-- You can also re-tab (or add an additional four spaces) for indentation
-inside your code. -->
+You can also re-tab (or add an additional four spaces) for indentation
+inside your code
+```markdown
my_array.each do |item|
puts item
end
+```
-<!-- Inline code can be created using the backtick character ` -->
+Inline code can be created using the backtick character `
+```markdown
John didn't even know what the `go_to()` function did!
+```
-<!-- In Github Flavored Markdown, you can use a special syntax for code. -->
-
+In Github Flavored Markdown, you can use a special syntax for code
+```markdown
\`\`\`ruby <!-- except remove those backslashes when you do this, just ```ruby ! -->
def foobar
puts "Hello world!"
end
\`\`\` <!-- here too, no backslashes, just ``` -->
+```
-<!-- The above text doesn't require indenting, plus Github will use syntax
-highlighting of the language you specify after the ``` -->
+The above text doesn't require indenting, plus Github will use syntax
+highlighting of the language you specify after the \`\`\`
-<!-- Horizontal rule (<hr />) -->
-<!-- Horizontal rules are easily added with three or more asterisks or hyphens,
-with or without spaces. -->
+## Horizontal rule
+Horizontal rules (`<hr/>`) are easily added with three or more asterisks or hyphens,
+with or without spaces.
+```markdown
***
---
- - -
****************
+```
-<!-- Links -->
-<!-- One of the best things about markdown is how easy it is to make links. Put
-the text to display in hard brackets [] followed by the url in parentheses (). -->
+## Links
-[Click me!](http://test.com/)
-
-<!-- You can also add a link title using quotes inside the parentheses. -->
+One of the best things about markdown is how easy it is to make links. Put
+the text to display in hard brackets [] followed by the url in parentheses ()
+```markdown
+[Click me!](http://test.com/)
+```
+You can also add a link title using quotes inside the parentheses.
+```markdown
[Click me!](http://test.com/ "Link to Test.com")
-
-<!-- Relative paths work too. -->
-
+```
+Relative paths work too.
+```markdown
[Go to music](/music/).
-
-<!-- Markdown also supports reference style links. -->
-
+```
+Markdown also supports reference style links.
+```markdown
[Click this link][link1] for more info about it!
[Also check out this link][foobar] if you want to.
[link1]: http://test.com/ "Cool!"
[foobar]: http://foobar.biz/ "Alright!"
-
-<!-- The title can also be in single quotes or in parentheses, or omitted
+```
+The title can also be in single quotes or in parentheses, or omitted
entirely. The references can be anywhere in your document and the reference IDs
-can be anything so long as they are unique. -->
-
-<!-- There is also "implicit naming" which lets you use the link text as the id. -->
+can be anything so long as they are unique.
+There is also "implicit naming" which lets you use the link text as the id.
+```markdown
[This][] is a link.
[this]: http://thisisalink.com/
+```
+But it's not that commonly used.
-<!-- But it's not that commonly used. -->
-
-<!-- Images -->
-<!-- Images are done the same way as links but with an exclamation point in front! -->
-
+## Images
+Images are done the same way as links but with an exclamation point in front!
+```markdown
![This is the alt-attribute for my image](http://imgur.com/myimage.jpg "An optional title")
-
-<!-- And reference style works as expected. -->
-
+```
+And reference style works as expected.
+```markdown
![This is the alt-attribute.][myimage]
[myimage]: relative/urls/cool/image.jpg "if you need a title, it's here"
+```
-<!-- Miscellany -->
-<!-- Auto-links -->
-
+## Miscellany
+### Auto-links
+```markdown
<http://testwebsite.com/> is equivalent to
[http://testwebsite.com/](http://testwebsite.com/)
+```
-<!-- Auto-links for emails -->
-
+### Auto-links for emails
+```markdown
<foo@bar.com>
+```
-<!-- Escaping characters -->
-
+### Escaping characters
+```markdown
I want to type *this text surrounded by asterisks* but I don't want it to be
in italics, so I do this: \*this text surrounded by asterisks\*.
+```
-<!-- Keyboard keys -->
-<!-- In Github Flavored Markdown, you can use a <kbd> tag to represent keyboard keys. -->
+### Keyboard keys
+In Github Flavored Markdown, you can use a `<kbd>` tag to represent keyboard keys.
+```markdown
Your computer crashed? Try sending a
<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Del</kbd>
+```
+### Tables
-<!-- Tables -->
-<!-- Tables are only available in Github Flavored Markdown and are slightly
-cumbersome, but if you really want it: -->
-
+Tables are only available in Github Flavored Markdown and are slightly
+cumbersome, but if you really want it:
+```markdown
| Col1 | Col2 | Col3 |
| :----------- | :------: | ------------: |
| Left-aligned | Centered | Right-aligned |
| blah | blah | blah |
+```
+or, for the same results
-<!-- or, for the same results -->
-
+```markdown
Col 1 | Col2 | Col3
:-- | :-: | --:
Ugh this is so ugly | make it | stop
-
-<!-- The end! -->
-
```
-
+---
For more info, check out John Gruber's official post of syntax [here](http://daringfireball.net/projects/markdown/syntax) and Adam Pritchard's great cheatsheet [here](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).
diff --git a/perl6.html.markdown b/perl6.html.markdown
index 45b15f05..3eec19f3 100644
--- a/perl6.html.markdown
+++ b/perl6.html.markdown
@@ -1,10 +1,9 @@
---
-name: perl6
category: language
language: perl6
filename: learnperl6.pl
contributors:
- - ["Nami-Doc", "http://github.com/Nami-Doc"]
+ - ["vendethiel", "http://github.com/vendethiel"]
---
Perl 6 is a highly capable, feature-rich programming language made for at
@@ -374,6 +373,8 @@ say @array[^10]; # you can pass arrays as subscripts and it'll return
say join(' ', @array[15..*]); #=> 15 16 17 18 19
# which is equivalent to:
say join(' ', @array[-> $n { 15..$n }]);
+# Note: if you try to do either of those with an infinite loop,
+# you'll trigger an infinite loop (your program won't finish)
# You can use that in most places you'd expect, even assigning to an array
my @numbers = ^20;
@@ -763,8 +764,9 @@ try {
# and `enum`) are actually packages. (Packages are the lowest common denominator)
# Packages are important - especially as Perl is well-known for CPAN,
# the Comprehensive Perl Archive Network.
-# You usually don't use packages directly: you use `class Package::Name::Here;`,
-# or if you only want to export variables/subs, you can use `module`:
+# You're not supposed to use the package keyword, usually:
+# you use `class Package::Name::Here;` to declare a class,
+# or if you only want to export variables/subs, you can use `module`:
module Hello::World { # Bracketed form
# If `Hello` doesn't exist yet, it'll just be a "stub",
# that can be redeclared as something else later.
@@ -774,11 +776,6 @@ unit module Parse::Text; # file-scoped form
grammar Parse::Text::Grammar { # A grammar is a package, which you could `use`
}
-# NOTE for Perl 5 users: even though the `package` keyword exists,
-# the braceless form is invalid (to catch a "perl5ism"). This will error out:
-# package Foo; # because Perl 6 will think the entire file is Perl 5
-# Just use `module` or the brace version of `package`.
-
# You can use a module (bring its declarations into scope) with `use`
use JSON::Tiny; # if you installed Rakudo* or Panda, you'll have this module
say from-json('[1]').perl; #=> [1]
@@ -870,8 +867,16 @@ LEAVE { say "Runs everytime you leave a block, even when an exception
PRE { say "Asserts a precondition at every block entry,
before ENTER (especially useful for loops)" }
+# exemple:
+for 0..2 {
+ PRE { $_ > 1 } # This is going to blow up with "Precondition failed"
+}
+
POST { say "Asserts a postcondition at every block exit,
after LEAVE (especially useful for loops)" }
+for 0..2 {
+ POST { $_ < 2 } # This is going to blow up with "Postcondition failed"
+}
## * Block/exceptions phasers
sub {
@@ -1239,14 +1244,14 @@ so 'foo!' ~~ / <-[ a..z ] + [ f o ]> + /; # True (the + doesn't replace the left
# Group: you can group parts of your regexp with `[]`.
# These groups are *not* captured (like PCRE's `(?:)`).
so 'abc' ~~ / a [ b ] c /; # `True`. The grouping does pretty much nothing
-so 'fooABCABCbar' ~~ / foo [ A B C ] + bar /;
+so 'foo012012bar' ~~ / foo [ '01' <[0..9]> ] + bar /;
# The previous line returns `True`.
-# We match the "ABC" 1 or more time (the `+` was applied to the group).
+# We match the "012" 1 or more time (the `+` was applied to the group).
# But this does not go far enough, because we can't actually get back what
# we matched.
# Capture: We can actually *capture* the results of the regexp, using parentheses.
-so 'fooABCABCbar' ~~ / foo ( A B C ) + bar /; # `True`. (using `so` here, `$/` below)
+so 'fooABCABCbar' ~~ / foo ( 'A' <[A..Z]> 'C' ) + bar /; # `True`. (using `so` here, `$/` below)
# So, starting with the grouping explanations.
# As we said before, our `Match` object is available as `$/`:
diff --git a/python.html.markdown b/python.html.markdown
index 2b43c5fc..f8f712d3 100644
--- a/python.html.markdown
+++ b/python.html.markdown
@@ -458,7 +458,7 @@ add(y=6, x=5) # Keyword arguments can arrive in any order.
# You can define functions that take a variable number of
-# positional args, which will be interpreted as a tuple if you do not use the *
+# positional args, which will be interpreted as a tuple by using *
def varargs(*args):
return args
@@ -466,7 +466,7 @@ varargs(1, 2, 3) # => (1, 2, 3)
# You can define functions that take a variable number of
-# keyword args, as well, which will be interpreted as a dict if you do not use **
+# keyword args, as well, which will be interpreted as a dict by using **
def keyword_args(**kwargs):
return kwargs
diff --git a/python3.html.markdown b/python3.html.markdown
index 2398e7ac..1f9d0e42 100644
--- a/python3.html.markdown
+++ b/python3.html.markdown
@@ -689,7 +689,7 @@ i.age # => raises an AttributeError
# You can import modules
import math
-print(math.sqrt(16)) # => 4
+print(math.sqrt(16)) # => 4.0
# You can get specific functions from a module
from math import ceil, floor
diff --git a/swift.html.markdown b/swift.html.markdown
index f3746613..df9c5092 100644
--- a/swift.html.markdown
+++ b/swift.html.markdown
@@ -32,7 +32,7 @@ import UIKit
// In Swift 2, println and print were combined into one print method. Print automatically appends a new line.
print("Hello, world") // println is now print
-print("Hello, world", appendNewLine: false) // printing without appending a newline
+print("Hello, world", terminator: "") // printing without appending a newline
// variables (var) value can change after being set
// constants (let) value can NOT be changed after being set
@@ -60,14 +60,14 @@ let piText = "Pi = \(π), Pi 2 = \(π * 2)" // String interpolation
print("Build value: \(buildValue)") // Build value: 7
/*
- Optionals are a Swift language feature that either contains a value,
- or contains nil (no value) to indicate that a value is missing.
- A question mark (?) after the type marks the value as optional.
+Optionals are a Swift language feature that either contains a value,
+or contains nil (no value) to indicate that a value is missing.
+A question mark (?) after the type marks the value as optional.
- Because Swift requires every property to have a value, even nil must be
- explicitly stored as an Optional value.
+Because Swift requires every property to have a value, even nil must be
+explicitly stored as an Optional value.
- Optional<T> is an enum.
+Optional<T> is an enum.
*/
var someOptionalString: String? = "optional" // Can be nil
// same as above, but ? is a postfix operator (syntax candy)
@@ -84,9 +84,9 @@ if someOptionalString != nil {
someOptionalString = nil
/*
- Trying to use ! to access a non-existent optional value triggers a runtime
- error. Always make sure that an optional contains a non-nil value before
- using ! to force-unwrap its value.
+Trying to use ! to access a non-existent optional value triggers a runtime
+error. Always make sure that an optional contains a non-nil value before
+using ! to force-unwrap its value.
*/
// implicitly unwrapped optional
@@ -120,8 +120,8 @@ anyObjectVar = "Changed value to a string, not good practice, but possible."
//
/*
- Array and Dictionary types are structs. So `let` and `var` also indicate
- that they are mutable (var) or immutable (let) when declaring these types.
+Array and Dictionary types are structs. So `let` and `var` also indicate
+that they are mutable (var) or immutable (let) when declaring these types.
*/
// Array
@@ -149,6 +149,14 @@ var explicitEmptyMutableDictionary: [String: Float] = [:] // same as above
// MARK: Control Flow
//
+// Condition statements support "where" clauses, which can be used
+// to help provide conditions on optional values.
+// Both the assignment and the "where" clause must pass.
+let someNumber = Optional<Int>(7)
+if let num = someNumber where num > 3 {
+ print("num is greater than 3")
+}
+
// for loop (array)
let myArray = [1, 1, 2, 3, 5]
for value in myArray {
@@ -178,8 +186,8 @@ while i < 1000 {
i *= 2
}
-// do-while loop
-do {
+// repeat-while loop
+repeat {
print("hello")
} while 1 == 2
@@ -198,7 +206,6 @@ default: // required (in order to cover all possible input)
let vegetableComment = "Everything tastes good in soup."
}
-
//
// MARK: Functions
//
@@ -209,25 +216,25 @@ default: // required (in order to cover all possible input)
// Function with Swift header docs (format as reStructedText)
/**
- A greet operation
+A greet operation
- - A bullet in docs
- - Another bullet in the docs
+- A bullet in docs
+- Another bullet in the docs
- :param: name A name
- :param: day A day
- :returns: A string containing the name and day value.
+:param: name A name
+:param: day A day
+:returns: A string containing the name and day value.
*/
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
-greet("Bob", "Tuesday")
+greet("Bob", day: "Tuesday")
// similar to above except for the function parameter behaviors
-func greet2(#requiredName: String, externalParamName localParamName: String) -> String {
+func greet2(requiredName requiredName: String, externalParamName localParamName: String) -> String {
return "Hello \(requiredName), the day is \(localParamName)"
}
-greet2(requiredName:"John", externalParamName: "Sunday")
+greet2(requiredName: "John", externalParamName: "Sunday")
// Function that returns multiple items in a tuple
func getGasPrices() -> (Double, Double, Double) {
@@ -240,11 +247,33 @@ let (_, price1, _) = pricesTuple // price1 == 3.69
print(price1 == pricesTuple.1) // true
print("Gas price: \(price)")
+// Labeled/named tuple params
+func getGasPrices2() -> (lowestPrice: Double, highestPrice: Double, midPrice: Double) {
+ return (1.77, 37.70, 7.37)
+}
+let pricesTuple2 = getGasPrices2()
+let price2 = pricesTuple2.lowestPrice
+let (_, price3, _) = pricesTuple2
+print(pricesTuple2.highestPrice == pricesTuple2.1) // true
+print("Highest gas price: \(pricesTuple2.highestPrice)")
+
+// guard statements
+func testGuard() {
+ // guards provide early exits or breaks, placing the error handler code near the conditions.
+ // it places variables it declares in the same scope as the guard statement.
+ guard let aNumber = Optional<Int>(7) else {
+ return
+ }
+
+ print("number is \(aNumber)")
+}
+testGuard()
+
// Variadic Args
func setup(numbers: Int...) {
// its an array
- let number = numbers[0]
- let argCount = numbers.count
+ let _ = numbers[0]
+ let _ = numbers.count
}
// Passing and returning functions
@@ -265,7 +294,7 @@ func swapTwoInts(inout a: Int, inout b: Int) {
}
var someIntA = 7
var someIntB = 3
-swapTwoInts(&someIntA, &someIntB)
+swapTwoInts(&someIntA, b: &someIntB)
print(someIntB) // 7
@@ -293,23 +322,17 @@ numbers = numbers.map({ number in 3 * number })
print(numbers) // [3, 6, 18]
// Trailing closure
-numbers = sorted(numbers) { $0 > $1 }
+numbers = numbers.sort { $0 > $1 }
print(numbers) // [18, 6, 3]
-// Super shorthand, since the < operator infers the types
-
-numbers = sorted(numbers, < )
-
-print(numbers) // [3, 6, 18]
-
//
// MARK: Structures
//
// Structures and classes have very similar capabilities
struct NamesTable {
- let names = [String]()
+ let names: [String]
// Custom subscript
subscript(index: Int) -> String {
@@ -353,6 +376,11 @@ internal class Rect: Shape {
}
}
+ // Computed properties must be declared as `var`, you know, cause' they can change
+ var smallestSideLength: Int {
+ return self.sideLength - 1
+ }
+
// Lazily load a property
// subShape remains nil (uninitialized) until getter called
lazy var subShape = Rect(sideLength: 4)
@@ -457,9 +485,10 @@ enum Suit {
// when the variable is explicitly declared
var suitValue: Suit = .Hearts
-// Non-Integer enums require direct raw value assignments
+// String enums can have direct raw value assignments
+// or their raw values will be derived from the Enum field
enum BookName: String {
- case John = "John"
+ case John
case Luke = "Luke"
}
print("Name: \(BookName.John.rawValue)")
@@ -503,7 +532,7 @@ protocol ShapeGenerator {
// Protocols declared with @objc allow optional functions,
// which allow you to check for conformance
@objc protocol TransformShape {
- optional func reshaped()
+ optional func reshape()
optional func canReshape() -> Bool
}
@@ -516,9 +545,9 @@ class MyShape: Rect {
// Place a question mark after an optional property, method, or
// subscript to gracefully ignore a nil value and return nil
// instead of throwing a runtime error ("optional chaining").
- if let allow = self.delegate?.canReshape?() {
+ if let reshape = self.delegate?.canReshape?() where reshape {
// test for delegate then for method
- self.delegate?.reshaped?()
+ self.delegate?.reshape?()
}
}
}
@@ -531,7 +560,7 @@ class MyShape: Rect {
// `extension`s: Add extra functionality to an already existing type
// Square now "conforms" to the `Printable` protocol
-extension Square: Printable {
+extension Square: CustomStringConvertible {
var description: String {
return "Area: \(self.getArea()) - ID: \(self.identifier)"
}
@@ -556,8 +585,8 @@ print(14.multiplyBy(3)) // 42
// Generics: Similar to Java and C#. Use the `where` keyword to specify the
// requirements of the generics.
-func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
- for (index, value) in enumerate(array) {
+func findIndex<T: Equatable>(array: [T], _ valueToFind: T) -> Int? {
+ for (index, value) in array.enumerate() {
if value == valueToFind {
return index
}
diff --git a/ua-ua/javascript-ua.html.markdown b/uk-ua/javascript-ua.html.markdown
index fedbf5ac..fedbf5ac 100644
--- a/ua-ua/javascript-ua.html.markdown
+++ b/uk-ua/javascript-ua.html.markdown
diff --git a/visualbasic.html.markdown b/visualbasic.html.markdown
index dfb89307..0371e6f6 100644
--- a/visualbasic.html.markdown
+++ b/visualbasic.html.markdown
@@ -45,10 +45,10 @@ Module Module1
Case "3" 'Calculating Whole Numbers
Console.Clear()
CalculatingWholeNumbers()
- Case "4" 'Calculting Decimal Numbers
+ Case "4" 'Calculating Decimal Numbers
Console.Clear()
CalculatingDecimalNumbers()
- Case "5" 'Working Calcculator
+ Case "5" 'Working Calculator
Console.Clear()
WorkingCalculator()
Case "6" 'Using Do While Loops
@@ -77,10 +77,10 @@ Module Module1
'One - I'm using numbers to help with the above navigation when I come back
'later to build it.
- 'We use private subs to seperate different sections of the program.
+ 'We use private subs to separate different sections of the program.
Private Sub HelloWorldOutput()
'Title of Console Application
- Console.Title = "Hello World Ouput | Learn X in Y Minutes"
+ Console.Title = "Hello World Output | Learn X in Y Minutes"
'Use Console.Write("") or Console.WriteLine("") to print outputs.
'Followed by Console.Read() alternatively Console.Readline()
'Console.ReadLine() prints the output to the console.
@@ -102,7 +102,7 @@ Module Module1
Console.WriteLine("Hello, What is your name? ") 'Ask the user their name.
username = Console.ReadLine() 'Stores the users name.
Console.WriteLine("Hello " + username) 'Output is Hello 'Their name'
- Console.ReadLine() 'Outsputs the above.
+ Console.ReadLine() 'Outputs the above.
'The above will ask you a question followed by printing your answer.
'Other variables include Integer and we use Integer for whole numbers.
End Sub
@@ -110,7 +110,7 @@ Module Module1
'Three
Private Sub CalculatingWholeNumbers()
Console.Title = "Calculating Whole Numbers | Learn X in Y Minutes"
- Console.Write("First number: ") 'Enter a whole number, 1, 2, 50, 104 ect
+ Console.Write("First number: ") 'Enter a whole number, 1, 2, 50, 104, etc
Dim a As Integer = Console.ReadLine()
Console.Write("Second number: ") 'Enter second whole number.
Dim b As Integer = Console.ReadLine()
@@ -126,10 +126,10 @@ Module Module1
'Of course we would like to be able to add up decimals.
'Therefore we could change the above from Integer to Double.
- 'Enter a whole number, 1.2, 2.4, 50.1, 104.9 ect
+ 'Enter a floating-point number, 1.2, 2.4, 50.1, 104.9, etc
Console.Write("First number: ")
Dim a As Double = Console.ReadLine
- Console.Write("Second number: ") 'Enter second whole number.
+ Console.Write("Second number: ") 'Enter second floating-point number.
Dim b As Double = Console.ReadLine
Dim c As Double = a + b
Console.WriteLine(c)
@@ -145,15 +145,15 @@ Module Module1
'Copy and paste the above again.
Console.Write("First number: ")
Dim a As Double = Console.ReadLine
- Console.Write("Second number: ") 'Enter second whole number.
- Dim b As Integer = Console.ReadLine
- Dim c As Integer = a + b
- Dim d As Integer = a * b
- Dim e As Integer = a - b
- Dim f As Integer = a / b
+ Console.Write("Second number: ") 'Enter second floating-point number.
+ Dim b As Double = Console.ReadLine
+ Dim c As Double = a + b
+ Dim d As Double = a * b
+ Dim e As Double = a - b
+ Dim f As Double = a / b
'By adding the below lines we are able to calculate the subtract,
- 'multply as well as divide the a and b values
+ 'multiply as well as divide the a and b values
Console.Write(a.ToString() + " + " + b.ToString())
'We want to pad the answers to the left by 3 spaces.
Console.WriteLine(" = " + c.ToString.PadLeft(3))
@@ -179,11 +179,11 @@ Module Module1
Console.Write("First number: ")
Dim a As Double = Console.ReadLine
Console.Write("Second number: ")
- Dim b As Integer = Console.ReadLine
- Dim c As Integer = a + b
- Dim d As Integer = a * b
- Dim e As Integer = a - b
- Dim f As Integer = a / b
+ Dim b As Double = Console.ReadLine
+ Dim c As Double = a + b
+ Dim d As Double = a * b
+ Dim e As Double = a - b
+ Dim f As Double = a / b
Console.Write(a.ToString() + " + " + b.ToString())
Console.WriteLine(" = " + c.ToString.PadLeft(3))
@@ -196,10 +196,10 @@ Module Module1
Console.ReadLine()
'Ask the question, does the user wish to continue? Unfortunately it
'is case sensitive.
- Console.Write("Would you like to continue? (yes / no)")
+ Console.Write("Would you like to continue? (yes / no) ")
'The program grabs the variable and prints and starts again.
answer = Console.ReadLine
- 'The command for the variable to work would be in this case "yes"
+ 'The command for the variable to work would be in this case "yes"
Loop While answer = "yes"
End Sub
@@ -211,7 +211,7 @@ Module Module1
Console.Title = "Using For Loops | Learn X in Y Minutes"
'Declare Variable and what number it should count down in Step -1,
- 'Step -2, Step -3 ect.
+ 'Step -2, Step -3, etc.
For i As Integer = 10 To 0 Step -1
Console.WriteLine(i.ToString) 'Print the value of the counter
Next i 'Calculate new value
@@ -222,7 +222,7 @@ Module Module1
'Eight
Private Sub ConditionalStatement()
Console.Title = "Conditional Statements | Learn X in Y Minutes"
- Dim userName As String = Console.ReadLine
+ Dim userName As String
Console.WriteLine("Hello, What is your name? ") 'Ask the user their name.
userName = Console.ReadLine() 'Stores the users name.
If userName = "Adam" Then
@@ -238,36 +238,34 @@ Module Module1
'Nine
Private Sub IfElseStatement()
- Console.Title = "If / Else Statement | Learn X in Y Minutes"
+ Console.Title = "If / Else Statement | Learn X in Y Minutes"
'Sometimes it is important to consider more than two alternatives.
'Sometimes there are a good few others.
'When this is the case, more than one if statement would be required.
'An if statement is great for vending machines. Where the user enters a code.
- 'A1, A2, A3, ect to select an item.
- 'All choices can be combined into a single if statement.
+ 'A1, A2, A3, etc to select an item.
+ 'All choices can be combined into a single if block.
- Dim selection As String = Console.ReadLine 'Value for selection
- Console.WriteLine("A1. for 7Up")
- Console.WriteLine("A2. for Fanta")
- Console.WriteLine("A3. for Dr. Pepper")
- Console.WriteLine("A4. for Diet Coke")
- Console.ReadLine()
- If selection = "A1" Then
- Console.WriteLine("7up")
- Console.ReadLine()
- ElseIf selection = "A2" Then
- Console.WriteLine("fanta")
- Console.ReadLine()
- ElseIf selection = "A3" Then
- Console.WriteLine("dr. pepper")
- Console.ReadLine()
- ElseIf selection = "A4" Then
- Console.WriteLine("diet coke")
- Console.ReadLine()
- Else
- Console.WriteLine("Please select a product")
- Console.ReadLine()
- End If
+ Dim selection As String 'Declare a variable for selection
+ Console.WriteLine("Please select a product form our lovely vending machine.")
+ Console.WriteLine("A1. for 7Up")
+ Console.WriteLine("A2. for Fanta")
+ Console.WriteLine("A3. for Dr. Pepper")
+ Console.WriteLine("A4. for Diet Coke")
+
+ selection = Console.ReadLine() 'Store a selection from the user
+ If selection = "A1" Then
+ Console.WriteLine("7up")
+ ElseIf selection = "A2" Then
+ Console.WriteLine("fanta")
+ ElseIf selection = "A3" Then
+ Console.WriteLine("dr. pepper")
+ ElseIf selection = "A4" Then
+ Console.WriteLine("diet coke")
+ Else
+ Console.WriteLine("Sorry, I don't have any " + selection)
+ End If
+ Console.ReadLine()
End Sub
diff --git a/yaml.html.markdown b/yaml.html.markdown
index 6e3e2c94..62f08fb9 100644
--- a/yaml.html.markdown
+++ b/yaml.html.markdown
@@ -3,6 +3,7 @@ language: yaml
filename: learnyaml.yaml
contributors:
- ["Adam Brenecki", "https://github.com/adambrenecki"]
+ - ["Suhas SG", "https://github.com/jargnar"]
---
YAML is a data serialisation language designed to be directly writable and
@@ -66,14 +67,19 @@ a_nested_map:
# Maps don't have to have string keys.
0.25: a float key
-# Keys can also be multi-line objects, using ? to indicate the start of a key.
+# Keys can also be complex, like multi-line objects
+# We use ? followed by a space to indicate the start of a complex key.
? |
This is a key
that has multiple lines
: and this is its value
-# YAML also allows collection types in keys, but many programming languages
-# will complain.
+# YAML also allows mapping between sequences with the complex key syntax
+# Some language parsers might complain
+# An example
+? - Manchester United
+ - Real Madrid
+: [ 2001-01-01, 2002-02-02 ]
# Sequences (equivalent to lists or arrays) look like this:
a_sequence:
@@ -101,12 +107,31 @@ json_seq: [3, 2, 1, "takeoff"]
anchored_content: &anchor_name This string will appear as the value of two keys.
other_anchor: *anchor_name
+# Anchors can be used to duplicate/inherit properties
+base: &base
+ name: Everyone has same name
+
+foo: &foo
+ <<: *base
+ age: 10
+
+bar: &bar
+ <<: *base
+ age: 20
+
+# foo and bar would also have name: Everyone has same name
+
# YAML also has tags, which you can use to explicitly declare types.
explicit_string: !!str 0.5
# Some parsers implement language specific tags, like this one for Python's
# complex number type.
python_complex_number: !!python/complex 1+2j
+# We can also use yaml complex keys with language specific tags
+? !!python/tuple [5, 7]
+: Fifty Seven
+# Would be {(5, 7): 'Fifty Seven'} in python
+
####################
# EXTRA YAML TYPES #
####################
diff --git a/zh-cn/swift-cn.html.markdown b/zh-cn/swift-cn.html.markdown
index 28001e3f..3efe4941 100644
--- a/zh-cn/swift-cn.html.markdown
+++ b/zh-cn/swift-cn.html.markdown
@@ -5,7 +5,8 @@ contributors:
- ["Grant Timmerman", "http://github.com/grant"]
translators:
- ["Xavier Yao", "http://github.com/xavieryao"]
- - ["Joey Huang", "http://github.com/kamidox"]
+ - ["Joey Huang", "http://github.com/kamidox"]
+ - ["CY Lim", "http://github.com/cylim"]
lang: zh-cn
---
@@ -13,13 +14,13 @@ Swift 是 Apple 开发的用于 iOS 和 OS X 开发的编程语言。Swift 于20
Swift 的官方语言教程 [Swift Programming Language](https://itunes.apple.com/us/book/swift-programming-language/id881256329) 可以从 iBooks 免费下载.
-亦可参阅:Apple's [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/RoadMapiOS/index.html) ——一个完整的Swift 教程
+亦可参阅:Apple's [getting started guide](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/) ——一个完整的Swift 教程
```swift
// 导入外部模块
import UIKit
-//
+//
// MARK: 基础
//
@@ -28,12 +29,14 @@ import UIKit
// TODO: TODO 标记
// FIXME: FIXME 标记
-println("Hello, world")
+// Swift2.0 println() 及 print() 已经整合成 print()。
+print("Hello, world") // 这是原本的 println(),会自动进入下一行
+print("Hello, world", appendNewLine: false) // 如果不要自动进入下一行,需设定进入下一行为 false
// 变量 (var) 的值设置后可以随意改变
// 常量 (let) 的值设置后不能改变
var myVariable = 42
-let øπΩ = "value" // 可以支持 unicode 变量名
+let øπΩ = "value" // 可以支持 unicode 变量名
let π = 3.1415926
let myConstant = 3.1415926
let explicitDouble: Double = 70 // 明确指定变量类型为 Double ,否则编译器将自动推断变量类型
@@ -46,16 +49,17 @@ let piText = "Pi = \(π), Pi 2 = \(π * 2)" // 格式化字符串
// 条件编译
// 使用 -D 定义编译开关
#if false
- println("Not printed")
+ print("Not printed")
let buildValue = 3
#else
let buildValue = 7
#endif
-println("Build value: \(buildValue)") // Build value: 7
+print("Build value: \(buildValue)") // Build value: 7
/*
- Optionals 是 Swift 的新特性,它允许你存储两种状态的值给 Optional 变量:有效值或 None
-
+ Optionals 是 Swift 的新特性,它允许你存储两种状态的值给 Optional 变量:有效值或 None 。
+ 可在值名称后加个问号 (?) 来表示这个值是 Optional。
+
Swift 要求所有的 Optinal 属性都必须有明确的值,如果为空,则必须明确设定为 nil
Optional<T> 是个枚举类型
@@ -67,13 +71,17 @@ var someOptionalString2: Optional<String> = "optional"
if someOptionalString != nil {
// 变量不为空
if someOptionalString!.hasPrefix("opt") {
- println("has the prefix")
+ print("has the prefix")
}
-
+
let empty = someOptionalString?.isEmpty
}
someOptionalString = nil
+/*
+ 使用 (!) 可以解决无法访问optional值的运行错误。若要使用 (!)来强制解析,一定要确保 Optional 里不是 nil参数。
+*/
+
// 显式解包 optional 变量
var unwrappedString: String! = "Value is expected."
// 下面语句和上面完全等价,感叹号 (!) 是个后缀运算符,这也是个语法糖
@@ -94,7 +102,7 @@ anyObjectVar = "Changed value to a string, not good practice, but possible."
/*
这里是注释
-
+
/*
支持嵌套的注释
*/
@@ -116,6 +124,7 @@ shoppingList[1] = "bottle of water"
let emptyArray = [String]() // 使用 let 定义常量,此时 emptyArray 数组不能添加或删除内容
let emptyArray2 = Array<String>() // 与上一语句等价,上一语句更常用
var emptyMutableArray = [String]() // 使用 var 定义变量,可以向 emptyMutableArray 添加数组元素
+var explicitEmptyMutableStringArray: [String] = [] // 与上一语句等价
// 字典
var occupations = [
@@ -126,6 +135,7 @@ occupations["Jayne"] = "Public Relations" // 修改字典,如果 key 不存
let emptyDictionary = [String: Float]() // 使用 let 定义字典常量,字典常量不能修改里面的值
let emptyDictionary2 = Dictionary<String, Float>() // 与上一语句类型等价,上一语句更常用
var emptyMutableDictionary = [String: Float]() // 使用 var 定义字典变量
+var explicitEmptyMutableDictionary: [String: Float] = [:] // 与上一语句类型等价
//
@@ -136,21 +146,21 @@ var emptyMutableDictionary = [String: Float]() // 使用 var 定义字典变量
let myArray = [1, 1, 2, 3, 5]
for value in myArray {
if value == 1 {
- println("One!")
+ print("One!")
} else {
- println("Not one!")
+ print("Not one!")
}
}
// 字典的 for 循环
var dict = ["one": 1, "two": 2]
for (key, value) in dict {
- println("\(key): \(value)")
+ print("\(key): \(value)")
}
// 区间的 loop 循环:其中 `...` 表示闭环区间,即[-1, 3];`..<` 表示半开闭区间,即[-1,3)
for i in -1...shoppingList.count {
- println(i)
+ print(i)
}
shoppingList[1...2] = ["steak", "peacons"]
// 可以使用 `..<` 来去掉最后一个元素
@@ -163,7 +173,7 @@ while i < 1000 {
// do-while 循环
do {
- println("hello")
+ print("hello")
} while 1 == 2
// Switch 语句
@@ -177,7 +187,7 @@ case "cucumber", "watercress":
let vegetableComment = "That would make a good tea sandwich."
case let localScopeValue where localScopeValue.hasSuffix("pepper"):
let vegetableComment = "Is it a spicy \(localScopeValue)?"
-default: // 在 Swift 里,switch 语句的 case 必须处理所有可能的情况,如果 case 无法全部处理,则必须包含 default语句
+default: // 在 Swift 里,switch 语句的 case 必须处理所有可能的情况,如果 case 无法全部处理,则必须包含 default语句
let vegetableComment = "Everything tastes good in soup."
}
@@ -219,8 +229,8 @@ let pricesTuple = getGasPrices()
let price = pricesTuple.2 // 3.79
// 通过下划线 (_) 来忽略不关心的值
let (_, price1, _) = pricesTuple // price1 == 3.69
-println(price1 == pricesTuple.1) // true
-println("Gas price: \(price)")
+print(price1 == pricesTuple.1) // true
+print("Gas price: \(price)")
// 可变参数
func setup(numbers: Int...) {
@@ -248,7 +258,7 @@ func swapTwoInts(inout a: Int, inout b: Int) {
var someIntA = 7
var someIntB = 3
swapTwoInts(&someIntA, &someIntB)
-println(someIntB) // 7
+print(someIntB) // 7
//
@@ -256,7 +266,7 @@ println(someIntB) // 7
//
var numbers = [1, 2, 6]
-// 函数是闭包的一个特例
+// 函数是闭包的一个特例 ({})
// 闭包实例
// `->` 分隔了闭包的参数和返回值
@@ -296,7 +306,7 @@ print(numbers) // [3, 6, 18]
struct NamesTable {
let names = [String]()
-
+
// 自定义下标运算符
subscript(index: Int) -> String {
return names[index]
@@ -306,7 +316,7 @@ struct NamesTable {
// 结构体有一个自动生成的隐含的命名构造函数
let namesTable = NamesTable(names: ["Me", "Them"])
let name = namesTable[1]
-println("Name is \(name)") // Name is Them
+print("Name is \(name)") // Name is Them
//
// MARK: 类
@@ -329,7 +339,7 @@ public class Shape {
internal class Rect: Shape {
// 值属性 (Stored properties)
var sideLength: Int = 1
-
+
// 计算属性 (Computed properties)
private var perimeter: Int {
get {
@@ -340,11 +350,11 @@ internal class Rect: Shape {
sideLength = newValue / 4
}
}
-
+
// 延时加载的属性,只有这个属性第一次被引用时才进行初始化,而不是定义时就初始化
// subShape 值为 nil ,直到 subShape 第一次被引用时才初始化为一个 Rect 实例
lazy var subShape = Rect(sideLength: 4)
-
+
// 监控属性值的变化。
// 当我们需要在属性值改变时做一些事情,可以使用 `willSet` 和 `didSet` 来设置监控函数
// `willSet`: 值改变之前被调用
@@ -352,14 +362,14 @@ internal class Rect: Shape {
var identifier: String = "defaultID" {
// `willSet` 的参数是即将设置的新值,参数名可以指定,如果没有指定,就是 `newValue`
willSet(someIdentifier) {
- println(someIdentifier)
+ print(someIdentifier)
}
// `didSet` 的参数是已经被覆盖掉的旧的值,参数名也可以指定,如果没有指定,就是 `oldValue`
didSet {
- println(oldValue)
+ print(oldValue)
}
}
-
+
// 命名构造函数 (designated inits),它必须初始化所有的成员变量,
// 然后调用父类的命名构造函数继续初始化父类的所有变量。
init(sideLength: Int) {
@@ -367,13 +377,13 @@ internal class Rect: Shape {
// 必须显式地在构造函数最后调用父类的构造函数 super.init
super.init()
}
-
+
func shrink() {
if sideLength > 0 {
--sideLength
}
}
-
+
// 函数重载使用 override 关键字
override func getArea() -> Int {
return sideLength * sideLength
@@ -394,16 +404,16 @@ class Square: Rect {
}
var mySquare = Square()
-println(mySquare.getArea()) // 25
+print(mySquare.getArea()) // 25
mySquare.shrink()
-println(mySquare.sideLength) // 4
+print(mySquare.sideLength) // 4
// 类型转换
let aShape = mySquare as Shape
// 使用三个等号来比较是不是同一个实例
if mySquare === aShape {
- println("Yep, it's mySquare")
+ print("Yep, it's mySquare")
}
class Circle: Shape {
@@ -411,12 +421,12 @@ class Circle: Shape {
override func getArea() -> Int {
return 3 * radius * radius
}
-
+
// optional 构造函数,可能会返回 nil
init?(radius: Int) {
self.radius = radius
super.init()
-
+
if radius <= 0 {
return nil
}
@@ -425,13 +435,13 @@ class Circle: Shape {
// 根据 Swift 类型推断,myCircle 是 Optional<Circle> 类型的变量
var myCircle = Circle(radius: 1)
-println(myCircle?.getArea()) // Optional(3)
-println(myCircle!.getArea()) // 3
+print(myCircle?.getArea()) // Optional(3)
+print(myCircle!.getArea()) // 3
var myEmptyCircle = Circle(radius: -1)
-println(myEmptyCircle?.getArea()) // "nil"
+print(myEmptyCircle?.getArea()) // "nil"
if let circle = myEmptyCircle {
// 此语句不会输出,因为 myEmptyCircle 变量值为 nil
- println("circle is not nil")
+ print("circle is not nil")
}
@@ -461,7 +471,7 @@ enum BookName: String {
case John = "John"
case Luke = "Luke"
}
-println("Name: \(BookName.John.rawValue)")
+print("Name: \(BookName.John.rawValue)")
// 与特定数据类型关联的枚举
enum Furniture {
@@ -469,7 +479,7 @@ enum Furniture {
case Desk(height: Int)
// 和 String, Int 关联的枚举记录
case Chair(brand: String, height: Int)
-
+
func description() -> String {
switch self {
case .Desk(let height):
@@ -481,9 +491,9 @@ enum Furniture {
}
var desk: Furniture = .Desk(height: 80)
-println(desk.description()) // "Desk with 80 cm"
+print(desk.description()) // "Desk with 80 cm"
var chair = Furniture.Chair(brand: "Foo", height: 40)
-println(chair.description()) // "Chair of Foo with 40 cm"
+print(chair.description()) // "Chair of Foo with 40 cm"
//
@@ -512,7 +522,7 @@ protocol ShapeGenerator {
class MyShape: Rect {
var delegate: TransformShape?
-
+
func grow() {
sideLength += 2
@@ -539,21 +549,21 @@ extension Square: Printable {
}
}
-println("Square: \(mySquare)") // Area: 16 - ID: defaultID
+print("Square: \(mySquare)") // Area: 16 - ID: defaultID
// 也可以给系统内置类型添加功能支持
extension Int {
var customProperty: String {
return "This is \(self)"
}
-
+
func multiplyBy(num: Int) -> Int {
return num * self
}
}
-println(7.customProperty) // "This is 7"
-println(14.multiplyBy(3)) // 42
+print(7.customProperty) // "This is 7"
+print(14.multiplyBy(3)) // 42
// 泛型: 和 Java 及 C# 的泛型类似,使用 `where` 关键字来限制类型。
// 如果只有一个类型限制,可以省略 `where` 关键字
@@ -566,7 +576,7 @@ func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
return nil
}
let foundAtIndex = findIndex([1, 2, 3, 4], 3)
-println(foundAtIndex == 2) // true
+print(foundAtIndex == 2) // true
// 自定义运算符:
// 自定义运算符可以以下面的字符打头:
@@ -581,11 +591,24 @@ prefix func !!! (inout shape: Square) -> Square {
}
// 当前值
-println(mySquare.sideLength) // 4
+print(mySquare.sideLength) // 4
// 使用自定义的 !!! 运算符来把矩形边长放大三倍
!!!mySquare
-println(mySquare.sideLength) // 12
+print(mySquare.sideLength) // 12
-```
+// 运算符也可以是泛型
+infix operator <-> {}
+func <-><T: Equatable> (inout a: T, inout b: T) {
+ let c = a
+ a = b
+ b = c
+}
+var foo: Float = 10
+var bar: Float = 20
+
+foo <-> bar
+print("foo is \(foo), bar is \(bar)") // "foo is 20.0, bar is 10.0"
+
+```