posted by Phan Ngọc Tiến on 2014-07-17 01:12

Tổng quan:

swift là ngôn ngữ lập trình mới của apple, nó được giới thiệu tài WWDC 14.

Nó được tích hợp cùng với iOS 8 trong Xcode 6 beta.

swift được apple hứa hẹn là nó tập hợp các ưu điểm của 2 loại ngôn ngữ lập trình đó là sự mạnh mẽ và mềm giẻo của ngôn ngữ compile và sự đơn giản của loại ngôn ngữ script.

các ưu điểm đáng kể đến của swift đó là:

  • Cú pháp đơn giản, ngắn và dể đọc

  • Type inference (xác định kiểu dữ liệu của các biến không được định nghĩa rỏ ràng tại thời điểm biên dịch)

  • Optional Chaining (khái báo bằng cách thêm vào dấu chấm hỏi "?" sau property,method,subscript)

  • Playground ( viết code và thực thi nó realtime)

Băt đầu:

  1. Khai báo biên, hằng

​Dùng "var" để khai báo 1 biết và "let" để khai báo 1 hằng

var name [: type] = value
let name [: type] = value

Bạn có thể sử dụng bất kỳ ký tự nào bạn thích để đặt tên cho biến và hằng, bao gồm cả những ký tự unicode

let π = 3.14159
let 你好 = "你好世界"

phần kiểu dữ liệu [type] trong câu lệnh khai báo  biết, hằng có thể có hoặc không, nếu bạn không khai báo kiểu dữ liệu thì swift sẽ tự động xác định kiểu dự liệu cho biết đó tại thời điểm biên dịch chương trình.

 

Giá trị không tự đổng chuyển sang 1 kiểu dữ liệu khác. Nếu bạn bạn muốn chuyển đổi kiểu dữ liệu của 1 giá trị nào đó thì bản phải viết chính sát thể hiện của kiểu dữ liệu đó.

var label : String = "this is label"
var width = 40
var lableWidth  = lable + String(width)

Có 1 cách đơn giản hơn để chuyển đổi kiểu dữ liệu sáng String đó là viết giá trị của biết đó và trong dấu "\()"

 

var labelWidth = lable + "\(width)"

      2.  Khai báo array, dictionary

 

Tạo 1 array, dictionary ta sử dụng cặp dấu ngoặc vuông [], đê truy cập và phần tử của array, dictionary ta chỉ cần ghi vị trí (index) và key vào trong cặp dấu ngoặc vuông

var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"

Tạo 1 array, dictionary rổng bạn có thể sử dụng 1 trong 2 cách

let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()

hoặc là đơn giản hơn là 

var myArray = []
var myDictionary =[:]

    3.  Các lênh điều khiển rẻ nhánh ( if, switch ... case), vòng lặp (for, for ... in, while, do ... while)

 

Điều kiện trong lệnh if bắt buộc phải là kiểu giá trị bool. Điều đó có nghĩa là đoạn lệnh như sau

 if score { ... }    // error

lệnh if của swift không ngầm so sánh với 0

Bạn có thể sử dụng "if" và "let" để lấy giá trị của những biến có thể bị mất. những biến như thế này được khai báo là 1 optionals ( thêm dâu "?" vào sau tên biến)

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}

Nếu optionalName bằng nil thì điều kiện của mệnh đề if sẽ false.

 

switch ... case  hổ trợ tất cả các kiểu dữ liệu và một số loại toán tử so sánh. Nó không giới hạn kiểu Int và so sánh bằng

let vegetable = "red pepper"
switch vegetable {
case "celery":let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
let vegetableComment = "Is it a spicy \(x)?"
default:
vegetableComment = "Everything tastes good in soup."

Khi khối lệnh sau case đúng được thực hiện thì chương trình thoát khỏi switch case không tiếp tục thực hiện các case tiếp, do đó bạn không cần phải thêm "break" vào mỗi case.

defautl trong switch ... case là bắt buộc

Dùng for ... in để lặp các phần tử trong dictionary

for (key,value) in myDictionary {
println "key :\(key) value: \(value)";
}

   4. function

 

Dùng func để định nghĩa function, khi gọi function thì dùng tên function và theo sau đó là list các đối số trong cặp dấu ngoặc tròn "()"

func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

   5. class

 

Dùng "class" theo sao là tên để định nghĩa 1 lớp. Các thuộc tính được định nghĩa giống như định nghĩa biến và hằng, các phương thức định nghĩa giống như định nghĩa 1 function

class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}

   6. Chương trình demo

Sau đây tôi xin demo 1 úng dụng máy tính bỏ túi chạy trên thiết bị iOS được viết bằng swift 

đầu tiên thì ta sử dụng xcode 6 để tạo 1 empty project và chọn ngôn ngữ swift. vì cả 2 ngôn ngữ swift và Objective C tương thích với nhau nên ta hoàn toàn viết 1 úng dụng có cả những file chạy bằng ngôn ngữ swift và cả những file chạy bằng Objective C.

Tiếp theo thì tạo 1 file viewcontroller. vào file/new/file/Source/Cocoa Touch class

Chọn vào "Also create XIB file" chọn ngôn ngữ "Swift".

 

 Điều khác biệt ở đây là khi tạo các lớp trong chương trình thay vì ta 2 file "m" và file "h" nhưng trong Objective thì với swift ta chỉ có 1 file đó là file ".swift" điều ngày có nghĩa là sẽ giảm thiểu được 1 nữa số lượng file được tạo.

 

Trong file ViewController.xib ta thiết kế 1 giao diện gồm các nút như hình sau

 

trong ViewController.swift ta định nghĩa một số hàm xữ lý sự kiện click lên các button

 

@IBAction func numClick(sender :AnyObject){
        var text = tfResult.text
        tfResult.text = text + sender.titleForState(UIControlState.Normal);
}

Bạn lên kết function trên với sự kiện touch Up Inside của tất cả các button ngoại trừ 3 button "=","C","DEL".  Button "C","DEL" bạn liên kết với 2 function tương ứng sau đây

 @IBAction func cClick(sender :AnyObject){
        var count = tfResult.text.utf16count;
        if count == 0 {return;}
        var text = tfResult.text.substringToIndex(count - 1)
        tfResult.text = text;
    }
    
    @IBAction func delClick(sender: AnyObject) {
        tfResult.text = "";
    }

 

Function tính kết quả của phép tính ở đây tôi sử dụng thuật toán "Nghich đảo balan" để chuyển biểu thức trung tố người sử dụng nhập vào thành biểu thức hậu tố tiện cho việc tính toán. Thuật toán trên có sử dụng Stack trong tinh toán, nhưng trong swift thì không có lớp Stack nào nên tôi tạo ra 1 lớp đặt tên là Stack.

Stack kế thừa từ lớp NSObject

Stack ta cần định nghĩa cho nó 1 thuộc tính là array và 1 số phương thức cần dùng sau: 

  • push
  • pop
  • peep
  • isEmpty 
class Stack {
    
    var array:Array<String> = [];
    
    func push(value:String){
        if value != "" {
            self.array.append(value);
        }        
    }
    func pop()->String{
        var index = self.array.count - 1;
        var value = self.array[index];
        self.array.removeLast();
        return value;
    }
    func peep()->String{
        var index = self.array.count - 1;
        var value = self.array[index];
        return value;
    }
    
    func isEmpty()-> Bool{
        return self.array.isEmpty;
    }
}

Function tính toán gia trị biểu thức hơi dài nên tôi không tiện ghi lên ở đây bạn có thể tải toàn bộ chương trình này tại : /uploads/files/Calculator.zip

Trong file Appdelegate.swift 

bạn sửa lại function sau

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        // Override point for customization after application launch.
        self.window!.backgroundColor = UIColor.whiteColor()
        var view =  ViewController(nibName: "ViewController", bundle: nil);
        self.window!.rootViewController = view;
        self.window!.makeKeyAndVisible()
        return true
    }

Bây giờ chạy và tận hương :D

Bạn có thể tim hiểu thêm về swift tại https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/


Leave a Comment

Fields with * are required.