Swift: An Introduction

swift

Khái quát

Swift là một ngôn ngữ lập trình mới được Apple trình diễn ở sự kiện WWDC 2014. Nó được Apple giới thiệu như một ngôn ngữ hiện đại, nhanh và mạnh, được thiết kế để tránh các lỗi xảy ra do lập trình viên như quên khởi tạo biến, cast từ kiểu này thành kiểu kia, tràn bộ nhớ blah blah, hỗ trợ viết code và xem kết quả ngay lập tức. Nói tóm lại Swift được quảng cáo là kết hợp được những cái tốt nhất của C và Objective-C

Blog này sẽ giới thiệu một số concept cơ bản trong Swift, so sánh nó một chút với Objective-C để mọi người kết luận được là ngôn ngữ nào dễ dùng với developer hơn.

Biến và Hằng trong Swift

Để khai báo 1 biến trong Swift thì ta sử dụng từ khoá var

var someInt = 69

Để khai báo 1 hằng số thì ta sử dụng từ khoá let

let unchanged = 96
let π = 3.14159

Nếu như các bạn cố tình thay đổi giá trị của hằng số thì complier sẽ cho bạn 1 lỗi ví dụ như là “Cannot assign to ‘let’ value”
Bạn có thể sử dụng gần như là tất cả các ký tự để đặt tên biến hoặc hằng, kể cả các ký tự Unicode

Trong Swift thì bạn không cần thiết phải định nghĩa chính xác kiểu của biến bởi vì compiler có thể tự suy ra kiểu của biến dựa vào giá trị khởi tạo của nó. Ví dụ như ở khai báo phía trên

let unchanged = 96

thì compiler sẽ tự định nghĩa kiểu của hằng unchanged là Int

Tuy nhiên bạn cũng có thể tự định nghĩa kiểu biến khi khai báo như sau

// - Swift
let unchanged : Int = 96
// - Objective-C
// -- Constant
NSInteger const someInt = 96
// -- Variable
NSInteger otherInt = 69

Các kiểu biến cơ bản trong Swift là

  • Float, Double (nếu như bạn không khai báo chính xác biến là compiler sẽ tự gán kiểu biến là Double)
  • Bool
  • String
  • Array
  • Dictionary

Nếu như bạn cần chuyển từ kiểu này sang kiểu khác, bạn phải tạo một đối tượng mới

let label = "The height is"
let height = 568
let heightLabel = label + String(height) // Nếu như bỏ String đi thì compiler sẽ báo lỗi

Để đặt một giá trị vào string thì có thể dùng 1 cách khác đơn giản hơn

 let heightLabel = "The height is \(height)"

Để khởi tạo array hoặc dictionary ta sử dụng [], lấy giá trị bằng cách viết index hoặc key trong []

//- Swift
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"

var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
 ]
occupations["Jayne"] = "Public Relations"

So với Objective-C thì Swift đã không còn phân biệt Mutable và Non-mutable đối với mảng và dictionary mà vẫn đảm bảo được hiệu suất của code

// Objective-C
NSArray * shoppingList = @["catfish", "water", "tulips", "blue paint"]; // bạn không thể thay đổi giá trị hay thêm bớt mảng này
NSMutableArray * mShoppingList = @["catfish", "water", "tulips", "blue paint"];
[mShoppingList replaceObjectAtIndex:1 withObject:"bottle of water"];

NSMutableDictionary * occupations = @[
    "Malcolm": "Captain",
    "Kaylee": "Mechanic"];
[occupations setObject:"Public Relations" forKey:"Jayne"];

Lớp và phương thức

Để tạo một class, gõ từ khoá class và tên của class. Phần triển khai của class được đặt trong dấu ngoặc nhọn {}
Nếu bạn muốn 1 class là class con của một class nào đó

class subClass : parentClass {
}

Để khai báo một phương thức, chúng ta dùng từ khoá func, tiếp theo đến danh sách các parameter với kiểu biến. Cuối cùng là giá trị trả về theo sau dấu “->”
Khi khai báo một phương thức, ta có thể khai báo 1 external parameter để phương thức trở nên dễ hiểu. Ví dụ

func doSomethingWithParamA(paramA : Int, withParamB paramB : Int) -> Int {
     return paramA + paramB
}

// Goi phương thức
let a = 100
let b = 200
doSomethingWithParamA(a, withParamB: b) // 300

Dưới đây là ví dụ về 1 class hoàn chỉnh

// 1
class TipCalculator {

  // 2
  let total: Double
  let taxPct: Double
  let subtotal: Double

  // 3
  init(total:Double, taxPct:Double) {
    self.total = total
    self.taxPct = taxPct
    subtotal = total / (taxPct + 1)
  }

  // 4
  func calcTipWithTipPct(tipPct:Double) -> Double {
    return subtotal * tipPct
  }

  // 5
  func printPossibleTips() {
    println("15%: \(calcTipWithTipPct(0.15))")
    println("18%: \(calcTipWithTipPct(0.18))")
    println("20%: \(calcTipWithTipPct(0.20))")
  }
}

// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()

Control Flow

For loop

Vòng for in dùng để duyệt qua tất cả các phần tử của tập hợp như là khoảng số, phần tử của mảng hay các ký tự trong chuỗi. 1…5 tương đương với [1…5]

for index in 1...5 {
    println("\(index) times 5 is \(index*5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

Nếu như bạn không cần dùng giá trị trong khoảng số thì ta có thể dùng dấu gạch dưới thay cho tên biến

let base = 3
let power = 10
var answer = 1
for _ in 1...power {
    answer *= base
}
println("\(base) to the power of \(power) is \(answer)")
// prints "3 to the power of 10 is 59049"

Dùng for-in để duyệt qua mảng và duyệt qua dictionary

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    println("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    println("\(animalName)s have \(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs

Cấu trúc vòng for-condition-increment thì tương tự các ngôn ngữ lập trình khác

for var index = 0; index < 3; ++index {
    println("index is \(index)")
}
// index is 0
// index is 1
// index is 2

Vòng lặp while

while condition {
    statements
}
do {
    statements
} while condition

If else

temperatureInFahrenheit = 90
if temperatureInFahrenheit <= 32 {     println("It's very cold. Consider wearing a scarf.") } else if temperatureInFahrenheit >= 86 {
    println("It's really warm. Don't forget to wear sunscreen.")
} else {
    println("It's not that cold. Wear a t-shirt.")
}

Switch-case

switch some value to consider {
case value 1:
    respond to value 1
case value 2,
value 3:
    respond to value 2 or 3
default:
    otherwise, do something else
}

Trong Swift, mỗi case có thể chứa nhiều giá trị và không còn bị giới hạn chỉ giá trị Integer nữa. Mỗi giá trị có thể là ký tự, số, khoảng, enum...

// Nhiều giá trị
let someCharacter: Character = "e"
switch someCharacter {
case "a", "e", "i", "o", "u":
    println("\(someCharacter) is a vowel")
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
    println("\(someCharacter) is a consonant")
default:
    println("\(someCharacter) is not a vowel or a consonant")
}
// Khoảng số
let count = 3_000_000_000_000
let countedThings = "stars in the Milky Way"
var naturalCount: String
switch count {
case 0:
    naturalCount = "no"
case 1...3:
    naturalCount = "a few"
case 4...9:
    naturalCount = "several"
case 10...99:
    naturalCount = "tens of"
case 100...999:
    naturalCount = "hundreds of"
case 1000...999_999:
    naturalCount = "thousands of"
default:
    naturalCount = "millions and millions of"
}
println("There are \(naturalCount) \(countedThings).")
// prints "There are millions and millions of stars in the Milky Way."

Một case trong switch có thể gán 1 hoặc nhiều giá trị của case cho 1 biến hoặc 1 hằng tạm thời để sử dụng trong phần thân của case

let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    println("on the x-axis with an x value of \(x)")
case (0, let y):
    println("on the y-axis with a y value of \(y)")
case let (x, y):
    println("somewhere else at (\(x), \(y))")
}
// prints "on the x-axis with an x value of 2"

Trong case có thể sử dụng where để kiểm tra thêm 1 điều kiện bổ sung

let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    println("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    println("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    println("(\(x), \(y)) is just some arbitrary point")
}
// prints "(1, -1) is on the line x == -y"

To be continued...

Add a Comment

Scroll Up