12/08/2018, 11:56

Những điểm hay ho của Swift so với Objective - C

Swift 2.0 đã chính thực được Apple phát hành cùng với Xcode 7.0, cộng đồng phát triển iOS đang từng ngày tiếp cận nhiều hơn với Swift thay vì Obj-C nên có lẽ thời điểm này không hề là quá sớm để các developer Framgia chúng ta bắt đầu làm quen với Swift. Bài viết này, mình sẽ điểm ra một vài điểm ...

Swift 2.0 đã chính thực được Apple phát hành cùng với Xcode 7.0, cộng đồng phát triển iOS đang từng ngày tiếp cận nhiều hơn với Swift thay vì Obj-C nên có lẽ thời điểm này không hề là quá sớm để các developer Framgia chúng ta bắt đầu làm quen với Swift.

Bài viết này, mình sẽ điểm ra một vài điểm mà mình cho là hay ho của Swift so với Obj-C.

** Type**

Swift cung cấp type inference tương tự như nhiều ngôn ngữ hiện đại khác. Điều này có nghĩa là các lập trình viên không cần phải chỉ ra type của variables nữa. Trình compiler sẽ tự động làm việc này cho chúng ta :

  // automatically inferred
var string1 = "dep trai co gi sai?"
// explicit typing (optional in this case)
var string2:String = "nha giau co gi sai?"

Quá tiện lợi đúng không?

** Generics**

Nếu đã quen thuộc với C++, Java có lẽ bạn đã từng nghe tới khái niệm này. Đôi khi bạn sẽ có một số function mà có các kiểu dữ liệu truyền vào khác nhau.

Ví dụ, ta viết một hàm như sau áp dụng cho kiểu dữ liệu integers :

struct IntPair {
    let a: Int!
    let b: Int!

    init(a: Int, b: Int) {
        self.a = a
        self.b = b
    }

    func equal() -> Bool {
        return a == b
    }
}

let intPair = IntPair(a: 5, b: 10)
intPair.a // 5
intPair.b // 10
intPair.equal() // false

Vậy giờ nếu ta muốn sử dụng hàm trên với các kiểu dữ liệu khác thì sao? Thay vì phải viết một hàm khá ta có thể viết như sau :

struct Pair<T: Equatable> {
    let a: T!
    let b: T!

    init(a: T, b: T) {
        self.a = a
        self.b = b
    }

    func equal() -> Bool {
        return a == b
    }
}

let pair = Pair(a: 5, b: 10)
pair.a // 5
pair.b // 10
pair.equal() // false

let floatPair = Pair(a: 3.14159, b: 2.0)
floatPair.a // 3.14159
floatPair.b // 2.0
floatPair.equal() // false

Tiện lợi quá phải không ?

Container

Nếu như NSArray, NSDictionary , NSMutableArray, NSMutableDictionary đã quá quen thuộc và được ưa thích Objective-C. Đối với Swift thì sao :

 let array = [1, 2, 3, 4]
let dictionary = ["dog": 1, "elephant": 2]

Trong Obj-C, arrays và dictionaries có thể chứa bất kì kiểu dữ liệu nào bạn thích. Trong Swift, arrays và dictionaries cũng là một kiểu dữ liệu. Nghe quen không ? Generics đó các bạn.

ta có thể viết như sau ( dù không cần thiết phải làm như vậy)

 let array: Array<Int> = [1, 2, 3, 4]
let dictionary: Dictionary<String, Int> = ["dog": 1, "elephant": 2]

Mutability

Trong SSwift ta không có NSMutable, tuy nhiên thay vào đó là letvar . let được sử dụng để khai báo các hằng, còn vả được sử dụng để khai báo các biến.

Đối với các collection, nếu được khai báo bằng let thì sẽ không thể thay đổi đươc size của collection đó. Tương tự như NSArray hay NSDictionary.

Điều tương tự được áp dụng với Dictionaries. Chú ý luôn sử dụng let đối với các collection có size không đổi sẽ giúp cải thiện việc sử dụng bộ nhớ nhé.

Strings

Strings trong Obj-C luôn tỏ ra rất phiền phức khi phải xử lí. Kể cả đối với những task đơn giản cũng có thể trở nên phức tạp.

ví dụ :

 Person *person = ...;

NSMutableString *description = [[NSMutableString alloc] init];
[description appendFormat:@"%@ is %i years old.", person.name, person.age];
if (person.employer) {
  [description appendFormat:@" They work for %@.", person.employer];
} else {
  [description appendString:@" They are unemployed."];
}

đối với Swift mọi chuyện đơn giản hơn nhiều

var description = ""
description += "(person.name) is (person.age) years old."
if person.employer {
    description += " They work for (person.employer)."
} else {
    description += " They are unemployed."
}

Rõ ràng hơn phải không ?

Ngoài ra, bạn hoàn toàn có thể ghép chuỗi với +=, không cần tới mutable string và immutable string nữa.

Swift cũng có thể so sánh String một cách hiệu quả và chính xác hơn với toán tử ==. Không cần tới isEqualToString method nữa. Điều này đồng nghĩa với việc bạn cso thể sử dụng Swift với cú pháp switch.

Swift String cũng hỗ trợ đầy đủ các kí tự Unicode. Bạn có thể sử dụng tất cả các Unicode code trong string, ngay cả hàm và tên biến.

Việc tính toán độ dài của string cũng tốt hơn trong Swift. Trong Object-C , NSString tính toán bằng cách đếm số của UTF16,những cặp 2 bytes được dùng để lưu trữ string. CHính vì thế nên khi string có Unicode, việc tính toán trở nên khó khăn hơn vì Unicode sử dụng 2 cặp 2 bytes để lưu trữ .

May mắn là trogn Swift chúng ta có function countElements

var poos = "u{1f4a9}u{1f4a9}"
countElements(poos) // 2

switch

Cuối cùng, so với Obj-C, switch cú pháp đã được cải thiện rất nhiều.

  1. Sử dụng string với switch: Đây là điều mà có thể trong quá khứ bạn rất muốn nhưng không thể làm được. Giờ thì sao ? Nếu ở Obj-C
 if ([person.name isEqualToString:@"Matt Galloway"]) {
  NSLog(@"Author of an interesting Swift article");
} else if ([person.name isEqualToString:@"Ray Wenderlich"]) {
  NSLog(@"Has a great website");
} else if ([person.name isEqualToString:@"Tim Cook"]) {
  NSLog(@"CEO of Apple Inc.");
} else {
  NSLog(@"Someone else);
}

và ở Swift

 switch person.name {
  case "Matt Galloway":
    println("Author of an interesting Swift article")
  case "Ray Wenderlich":
    println("Has a great website")
  case "Tim Cook":
    println("CEO of Apple Inc.")
  default:
    println("Someone else")
}
  1. Cases trong switch của Swift giờ đây không cần break nữa. Điều này sẽ giúp tránh được những lỗi không đáng có do bạn quên không break.
case 0, 1, 2:
    println("Small")
case 3...7:
    println("Medium")
case 8..<10:
    println("Large")
case _ where i % 2 == 0:
    println("Even")
case _ where i % 2 == 1:
    println("Odd")
default:
    break
}

Một điều thú vị khác mà bạn thấy là có thể sử dụng các toán tử ... , ..< . Điều này thực sự hữu ích.

0