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
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:
Prześlij komentarz