piątek, 12 grudnia 2014

iOS, a co to jest - odcinek piąty: Swift cz.3

Dziś jeszcze o Swift, przy czym już bez dużej awangardy. Wymienię mniejsze rzeczy, które zwróciły moją uwagę.

  • stringi
    • operator porównania
    • NSMutableString  - obok String
  • typy numeryczne
    • .predecessor(), .successor(), .advancedBy(k), .distanceTo(k)  - czy to nie jest już przerost formy nad treścią?
    • .addWithOverflow(…) - dodawanie z informacją o wystąpieniu przepełnienia, podobne funkcje są także do innych operacji arytmetycznych
  • tablice
    • indekser obsługujący operator zakresu
    • +=, .extend pozwalające wygodnie do jednej tablicy dodać inną
    • .revert(), .filter(…), .map(…), .reduce(…),  sort(…), sorted(…)  - mamy wszystko czego potrzebujemy, nawet możliwość realizacji sumowania w jednej linii dzięki reduce, a także sortowanie w dwóch wariantach - z modyfikacją tablicy i ze zwróceniem posortowanej kopii
  • predefiniowane protokoły Equatable, Comparable i Printable - dużą awangardą jest to, że deklarujemy obsługę protokołu, a w dwóch pierwszych przypadkach definiujemy funkcje globalne o nazwach == i >.  Printable to jakby taki odpowiednik metody ToString() w C#, ale implementujemy propercję, a obiekt możemy wypisać za pomocą println.
  • funkcje globalne - mamy jakby renesans takich funkcji, siłą rzeczy dostajemy je w upowszechniającym się JavaScript czy dostaniemy wizualnie taką postać przez import klasy statycznej w C#6, Swift oferuje kilka predefiniowanych tj. print(), println(), sort(), sorted(). Takie połączenie oldschool-u z nowoczesnością. Przy czym szczególnie te dwie ostatnie wydają mi się trochę umowne. Czemu akurat sortowanie ma być za pomocą funkcji globalnej?  A może to pójście krok dalej, skoro porównywanie robimy globalnymi w sumie funkcjami, to czemu nie robić także sortowania?
  • przekazywanie adresu tablicy przez & do funkcji, która ją zmodyfikuje - jakby krok wstecz do składni C#, dodatkowo pamiętajmy, że tablice są strukturami
  • podpinanie do zdarzenia metody zapisanej jako string - jakby krok wstecz, także do Objective-C
  • bardzo trudna i dziwna implementacja singletonu

 

Wbudowane typy

  • Bool
  • Int32
  • Int16
  • Int8
  • Int
  • UInt64
  • UInt32
  • UInt16
  • UInt8
  • UInt
  • Double
  • Float
  • String
  • Array<T>
  • Dictionary<T>
  • Optional<T>

Operacje na stringach

“ “.isEmpty

str.hasPrefix(“Pro”)

str.hasSuffix(“Forma”)

str.toInt()   //przy sukcesie {Some liczba}, inaczej nil

let str = “a” + “”b”

let a: Character = “a”

let b: Character = “b”

let c = a + b

str += “xxx”

var b = str1 == str2

“amber” < “gold”  // operatory porównania, a jest wcześniej niż g

“C:/Users/Marcin/Desktop”.componentsSeparatedByString(“/”)

let str = NSMutableString(string:  “Pro”)

str.appendString(“ Forma”)

Operacje na typach numerycznych

var n = 41

n.predecessor()   //40

n.successor()  //42

n.advancedBy(10)  //51

n.advancedBy(-10)  //31

n.distanceTo(20)   //-21

var (result, overflowed)  = Int.addWithOverflow(3, 5)   // (8, false),  także: substract*, multiply*, divide*

Int.max,  Int.min

let m = UInt(12)

let pi = 3.14159

sizeofValue(pi)

Double.abs(-10.0)   //10

Operacje na tablicach

let instruments = [“trąbka”, “gitara”, “sampler”]

instruments[1..<3]   // [“gitara”, “sampler”], obsługa operatora zakresu

instruments.append(“klawisze”)

instruments += [“syntetyzator”]

instruments.insert(“puzon”, atIndex: 2)

instruments.removeAtIndex(0)

instruments.removeRange(0…2)

instruments.removeAll(keepCapacity:  true)

instruments.capacity

instruments.extend([“klarnet”, “gitara basowa”, “perkusja”])

instruments.count

instruments.isEmpty //wg. count

instruments.reserveCapacity(9)

let sortedInstruments = instruments.sorted() { $0 < $1 }  //bez zmiany tablicy, zwracana tablica

instruments.sort()  { $0 < $1 }  //zmiana tablicy

instruments.reverse()

let array = instruments.filter() { $0  > “klm” }

let names = items.map()  { $0.name }

let total = array.reduce(0)  { $0 + $1  }  //pierwszy argument: wartość początkowa

Operacje na słownikach

var dictionary = [

         “Piesek”:  “Leszek”,

         “Koń”:  “Rafał”,

         “Miś”:  “Push-Upek”

]

dictionary[“Piesek”]   // {Some  “Leszek”}

dictionary[“Miś”] = “Uszatek”

dictionary.updateValue(“Uszatek”, forKey: “Miś”)  //zwraca starą wartość

dictionary.removeValueForKey(“Koń”)  //zwraca starą wartość

dictionary.count

let keys = dictionary.keys

let values = dictionary.values

Array(keys)

Array(values)

 

Publicznie zdefiniowane protokoły

  • Equatable
  • Comparable
  • Printable

extension Album: Equatable {

}

func == (a1: Album, a2: Album) –> Bool {

        return a1.title == a2.title && a1.artist == a2.artist

}

extension Album: Comparable {  //rozszerza Equatable

}

func < (a1: Album, a2: Album)  -> Bool {

         return a1.title < a2.title

}

extension Album: Printable {

         var description: String {

                 return “\(artist)  \(title)”

         }

}

println(a1)

 

Globalne funkcje

  • print()
  • println()
  • sort()
  • sorted()

sortowanie wymaga Comparable i Equatable

sort(&albums)   //parametr ze słowem kluczowym inout

sort(&albums)  { $0.title < $1.title }   //ze zignorowaniem Comparable

var sortedAlbums = sorted(albums)  //kopiowanie, bez ingerencji w tablicę

 

Objective-C a Swift

Mapowanie typów

  • id –> AnyObject
  • NSString –> String
  • * –> ?

Wywoływanie metod

button.addTarget(self, action: “didPressButton:”, forControlEvents: .AllEditingEvents)

Obsługa błędów

let fm = NSFileManager.defaultManager()

var error: NSError?

if let contents = fm.contentsOfDirectoryAtPath(“/Data”, error: &error)  {

        …

}

else  {

        println(“error: \(error)”)

}

 

Źródła wiedzy

i-book: 

  • The Swift Programming Language
  • Using Swift with Cocoa and Objective-C

Dokumentacja XCode

http://swifter.natecook.com/

forum swift dla deweloperów apple

 

Trudny singleton

class Singleton {

        class var sharedInstance: Singleton  {

                struct Static {

                          static var onceToken:  dispatch_once_t = 0

                          static var instance:  Singleton?  = nil

                }

                dispatch_once(&Static.onceToken)  {

                          Static.instance = Singleton()

                }

                return Static.instance!

       }

}

 

Inne zagadnienia

  • kontrola dostępu
  • kontrola przepływu
  • własne operatory
  • łączenie w łańcuch elementów opcjonalnych
  • interoperabilność z Objective-C

Brak komentarzy: