Sunday, November 9, 2014

Tutorial iPhone Development Intro Video





Hi guys!



I will create a tutorial video for each my tutorial. It has a YouTube link. Go to link and subscribe. Thank you so much!

Saturday, October 18, 2014

Swift Tutorial: A Quick Start (Bản dịch)

Click here...
Đây là bản dịch ra tiếng Việt của bài tut theo link nguồn sau:
Swift Tutorial: A Quick Start
(Có một số chỗ mình không thể dịch được, sợ sai nghĩa, nên mình để tiếng Anh gốc luôn.)


Swift là một ngôn ngữ mới ken cà ren của Apple, nó vừa được giới thiệu trong năm nay tại WWDC.
Bạn có thể đọc hướng dẫn sử dung của Apple tại link này: Swift reference guide
Tuy nhiên, cái hướng dẫn sử dụng của Apple nó quá dài đi, cho nên nếu bạn không có nhiều thời gian và muốn học Swift một cách nhánh chóng thì bài hướng dẫn sau đây sẽ là điều bạn cần.
Bài hướng dẫn này sẽ mất khoảng 15 phút và nó sẽ cho bận một tua du lịch nhanh thăm quan ngôn ngữ Swift này, bao gồm: variables, control flow, classes, những bài thực hành tốt nhất và nhiều hơn nửa.
Để thực hành theo bài hướng dẫn này bạn sẽ cần Xcode bản mới nhất (>= Xcode 6). Bạn không cần phải có kinh nghiệm về Swift hoặc Objective-C từ trước, nhưng nếu bạn có thì nó sẽ giúp ích cho bạn nhiều trong bài hướng dẫn này đấy.
Chú ý: Hãy chắc chắn là bạn có bản Xcode mới nhất nhé (kiểm tra ở iOS Developer Center). Swift nó thay đổi lia lịa và chúng tôi cũng đang update mỗi ngày bài hướng dẫn này, mã code có thể nó không chạy trên những version Xcode dưới 6 nha!
Chú ý: lúc viết hướng dẫn này chúng tôi không thể post screenshots của Xcode 6, bởi vì chúng tôi dùng bản beta. Cho nên bài hướng dẫn này không có ảnh nhé! Chúng tôi sẽ update lại nếu như có bản chính thức.
Giới thiệu về Playgrounds
Bật Xcode 6 lên, và đi đến File\New\File. Chọn iOS\Source\Playground, và click Next
Đặt tên cho file là SwiftTutorial.playground, click Next, và lưu file đó ở nơi đâu mà bạn dễ tìm. Xóa mọi thứ trong file của bạn để bạn có thể bắt đầu với một clean slate.
Chú ý: Sau khi bạn tạo playground, bạn có thể gặp một lỗi: “Error running playground: Failed to prepare for communication with playground”. Nếu nó xảy ra, đơn giản là bạn shut down Xcode và khởi động lại nó.
Một playground  là dạng file mới mà nó cho phép bạn kiểm tra code Swift, và cho phép bạn xem kết quả của mỗi dòng code trong sidebar. Ví dụ, bạn đánh mấy dòng code sau trong playground của bạn:
let tutorialTeam = 56
let editorialTeam = 23
let totalTeam = tutorialTeam + editorialTeam

Khi bạn đánh những dòng code này, bạn sẽ thấy kết quả của mỗi dòng code trong sidebar.
Playgrounds là một cách tuyệt vời để học Swift, để thử nghiệm những API mới, hay để prototype code hoặc algorithms, hay để thấy được những code drawing. Trong bài hướng dẫn này bạn sẽ làm việc trong playground.
Chú ý: Lúc này, Tôi khuyên bạn là nên kéo playground file (SwiftTutorial.playground) đến OS X Dock của bạn. This way, you can use this file as a quick scratchpad whenever you want to test out some Swift code.
Variables vs. Constants in Swift
Biến và hằng trong Swift
Try adding the following line to the bottom of your playground:
totalTeam += 1
Thêm dòng code sau vào phía dưới trong playground:
totalTeam += 1

Bạn sẽ gặp một lỗi khi bạn thêm dòng code đó. Nguyên nhân là totalTeam  là một hằng, có nghĩa là giá trị của nó không bao giờ được thay đổi. Bạn khai báo hằng với từ khóa: let
Bạn muốn tutorialTeam  là một biến, giá trị của nó có thể thay đổi, bạn cần khai báo nó với một từ khóa khác: var
Thay đổi đoạn code đó với một khởi tạo cho biến totalTeam :
var totalTeam = tutorialTeam + editorialTeam
Now it works! You may think to yourself, “why not just declare everything with var, since it’s less restrictive?”
OK nó đã chạy. Bây giờ bạn có thể nghĩ: tại sao không khai báo mọi thứ với var ?
Well, declaring things with let whenever possible is best practice, because that will allow the compiler to perform optimizations that it wouldn’t be able to do otherwise. So remember: prefer let!
Tốt hơn, là bạn bạn khai báo mọi thứ với từ khóa let  bất kì lúc nào có thể thì đó sẽ là một cách làm tốt nhất. Because that will allow the compiler to perform optimizations that it wouldn’t be able to do otherwise. So remember: prefer let!

Explicit và Inferred Typing
Cho đến lúc này, bạn không sẽ không rõ ràng khi bạn thiết lập kiểu cho mỗi hằng và biến, bới vì compiler nó có đủ thông tin để suy ra kiểu một cách tự động.
Ví dụ, bởi vì bạn thiết lập tutorialTeam  là 56, compiler biết 56 là một Int, do đó nó thiết lập kiểu cho tutorialTeam  là Int cho bạn một cách một tự động.
Tuy nhiên, bạn có thể thiết lập kiểu rõ ràng nếu bạn muốn. Hãy thay đổi dòng code để thiết lập tutorialTeam theo như sau:
let tutorialTeam: Int = 56
Cách tốt hơn là cứ để cho thằng compiler nó tự động thiết lập kiểu cho biến , bởi vì cái thuận lợi chính của ngôn ngữ Swift là: ngắn gọn, súc tích và dễ dàng đọc code.
Do đó, hãy sửa lại dòng code là:
let tutorialTeam = 56

Basic Types và Control Flow trong Swift
Bạn đã vừa mới xem một ví dụ về Int, đây là một kiểu Swift mà được sử dụng cho giá trị integer, những có một kiểu lớn hơn nửa.
Floats and Doubles
let priceInferred = 19.99
let priceExplicit: Double = 19.99
Có 2 kiểu cho giá trị decimal point là: Float  và DoubleDouble nó có nhiều sự chính xác hơn, và kiểu này là mặc định cho những giá trị decimal. That meanspriceInferred is a Double too.
Bools
let onSaleInferred = true
let onSaleExplicit: Bool = false
Chú ý rằng trong Swift bạn dùng true/false những giá trị Boolean (không giống như Obj-C là ta dùng YES/NO).
Strings
let nameInferred = "Whoopie Cushion"
let nameExplicit: String = "Whoopie Cushion"
Strings are as you’d expect, except note that you no longer use the @ sign like you do in Objective-C. That might take your muscle memory a bit to get used to! :]
Strings là những gì bạn mong đợi, ngoại trừ là bạn sẽ không dùng kí tự @ như trong Obj-C. Cái này có thể làm giản bộ nhớ.
If statements and string interpolation
if onSaleInferred {
  println("\(nameInferred) on sale for \(priceInferred)!")
} else {
  println("\(nameInferred) at regular price: \(priceInferred)!")
}
Đây là một ví dụ về một câu lệnh if, nó cũng giống như những ngôn ngữ khác. Dấu ngoặc đơn bao xung quang kiều kiện thì nó một lựa chọn, có cũng đc, không cũng đc những dấu ngoặc kép là phải có mỗi dòng code dưới if hoặc else.
Khi bạn muốn chèn một biến vào trong một string thì đơn giản là bạn code theo cú pháp:  \(your expression).
Ở đây bạn sẽ tự hỏi, không biết output mà println nó in ra là ở file nào. Để xem cái đó, hãy tới: Assistant Editor with View\Assistant Editor\Show Assistant Editor.
Đây là file output của bài hướng dẫn này:  playground file 
Classes và Methods
Một trong những việc hay làm  nhất đó là tạo ra những lớp và những phương thức. Đầu tiên hãy xóa mọi thứ trong playground của bạn đi.
Tiếp theo là bạn sẽ tạo một lớp tính toán tip mà nó sẽ giúp bạn tính toán tiền bạn trả tại một nhà hang. Bạn sẽ thêm dòng code nhỏ, rùi sẽ có giải thích từng bước tại mỗi dòng code:
// 1
class TipCalculator {
}
Để tạo một class, đơn giản là thêm từ khóa class  và đặt tên cho class của bạn.Sau đó bạn thêm 2 dấu {} cho class body. Nếu bạn muốn tạo một subclassing của một class khác, bạn sẽ thêm dấu : và sau đó đặt tên cho subclassing của bạn. Chú ý là bạn không cầ thiết phải cần bất cứ subclass nào cả (không giống như Obj-C, ở đó bạn phải subclass NSObject hay một gì đó nó kế thừa từ NSObject).
Thêm những dòng code vào bên trong cặp dấu {}
  // 2
  let total: Double
  let taxPct: Double
  let subtotal: Double
This is how you create properties on a class – the same way as creating variables or constants. Here you create three constant properties – one for the bill’s total (post-tax), one for the tax percentage that was applied to the bill, and one for the bill’s subtotal (pre-tax).
Đây là cách mà bạn tạo những thuộc tính trong một class – tạo những biến và hằng cũng giống như vậy. Ở đây bạn tạo 3 thuộc tính hằng – một cho bill’s total, một cho phần trăm thuế ,mà được tính trong bill, và một cho bill’s subtotal (pre-tax).
Chú ý rằng bất kì thuộc tính nào mà bạn khai báo phải khởi tạo một giá trị cho nó, hoặc trong phần khởi tạo của bạn.
Thêm đoạn code tiếp theo đây sau cặp dấu {} trên (bên trong cặp dấu {})
  // 3
  init(total:DoubletaxPct:Double) {
    self.total = total
    self.taxPct = taxPct
    subtotal = total / (taxPct + 1)
  }
Đoạn code trên tạo ra một phần khởi tạo cho class mà nó có 2 tham số. Phần khởi tạo thì thường có tên init trong Swift – bạn có thể có nhiều hơn 1 hàm khởi tạo nếu bạn muốn, nhưng chúng phải khác tham số.
Chú ý là bạn đã cho những tên tham số của phương thức này và những tên những thuộc tính giống nhau. Do đó, bạn sẽ có từ khóa tiền tố self  nó đứng trước những thuộc tính, còn lại là tham số.
Chú ý rằng không có tên nào conflict với thuộc tính subtotal , cho nên bạn không cần thêm từ khóa self , bởi vì compiler có thể tự động detect được.
Chú ý: ở đây thì subtotal = total / (tipPct + 1) sẽ được tính toàn từ đâu? Từ đây:
(subtotal * taxPct) + subtotal = total
subtotal * (taxPct + 1) = total
subtotal = total / (taxPct + 1)
Thêm tiếp đoạn code sau trong cặp dấu {}
  // 4
  func calcTipWithTipPct(tipPct:Double) -Double {
    return subtotal * tipPct
  }
To declare a method, you use the func keyword. You then list the parameters (you must be explicit with the types), add the -> symbol, and finally list the return type.
Để khai báo một phương thức, bạn sử dụng từ khóa func . Sau đó bạn list những tham số (bạn phải xác định kiểu dữ liệu), thêm kí hiệu -> , và cuối cùng đưa ra kiểu dữ liệu trả về.
Hàm này nó định nghĩa amount to tip, which is as simple as multiplying the subtotal by the tip percentage.
Add this code after the previous block (inside the curly braces):
Thêm tiếp đoạn code này trong cặp dấu {}
  // 5
  func printPossibleTips() {
    println("15%: \(calcTipWithTipPct(0.15))")
    println("18%: \(calcTipWithTipPct(0.18))")
    println("20%: \(calcTipWithTipPct(0.20))")
  }
Đây là một hàm mới mà nó in ra 3 tip có thể có.
Chú ý rằng khi bạn gọi một phương thức trong một thể hiện của class, thì tham số đầu tiên không cần phải đặt tên.
Also, notice how string interpolation isn’t limited to printing out variables. You can have all kinds of complicated method calls and operations right inline if you like!
Thêm đoạn code này ở dưới cùng của playground (sau dấu cặp dấu {})
// 6
let tipCalc = TipCalculator(total: 33.25taxPct: 0.06)
tipCalc.printPossibleTips()
Cuối cùng bạn tạo một thể hiện của class và gọi phương thức để in possible tips.
Đây là toàn bộ code mà bạn đã vừa mới làm:
// 1
class TipCalculator {

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

  // 3
  init(total:DoubletaxPct: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.25taxPct: 0.06)
tipCalc.printPossibleTips()
Xem kết quả ở Assistant Editor.
Arrays và For Loops
Hiện tại có một vài duplication trong đoạn code trên, bời bạn đang gọi phương thứccalcTipWithTotal một vài lần với những % tip khác nhau. Bạn có thể hạn chế duplication ở đây bằng một array.
Thay đổi nội dung của printPossibleTips với đoạn code sau:
let possibleTipsInferred = [0.150.180.20]
let possibleTipsExplicit:[Double] = [0.150.180.20]
Đoạn code trên minh họa một ví dụ tạo một mảng doubles, với 2 loại, loại tự detect kiểu dữ liệu, loại định nghĩa chính xác kiểu dữ liệu luôn. Chú ý [Double] chỉ là dạng rút gọn của Array<Double>.
Sau đó thêm những dòng code bên dưới:
for possibleTip in possibleTipsInferred {
  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}
Duyệt qua những item trong một mảng thì nó đơn giản hơn trong Obj-C – chú ý là không có dấu ngoặc đơn nhé.
for i in 0..<possibleTipsInferred.count {
  let possibleTip = possibleTipsInferred[i]
  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}
Toán tử ..< là một non-inclusive range operator và không bao gồm the upper bound value. Cũng có một toán tử ... mà nó thì inclusive.
Arrays có một thuôc tính count thể hiện số lượng item của mảng. Bạn có thể lấy ra một item cụ thể trong một mảng với cú pháp arrayName[index], giống nhưng bạn xem ở trên.
Dictionaries
Hãy làm một sự thay đổi cuối cùng trong việc tính toán tip. Thay vì đơn giản bạn in những tip, bạn có thể return một dictionary với những kết quả. Điều này làm dể dàng hơn để hiển thị những kết quả.
Delete the printPossibleTips method and replace it with the following:
Xóa phương thức printPossibleTips và thay thế bằng một phương thức sau:
// 1
func returnPossibleTips() -[Int: Double] {

  let possibleTipsInferred = [0.150.180.20]
  let possibleTipsExplicit:[Double] = [0.150.180.20]

  // 2
  var retval = Dictionary<Int, Double>()
  for possibleTip in possibleTipsInferred {
    let intPct = Int(possibleTip*100)
    // 3
    retval[intPct] = calcTipWithTipPct(possibleTip)
  }
  return retval

}
Hãy xem xét phương thức trên:

1.        Ở đây bạn đang tạo ra một phương thức mà nó return một dictionary, ở đó key là một Int (tip percentage như là một int, giống như 15 hoặc 20), và giá trị là một Double (tip đã tính toán). Chú ý rằng [Int: Double]chỉ là dạng rút gọn của Dictionary<Int, Double>.
2.        Đây là cách bạn tạo một dictionary rỗng. Chú ý rằng khi bạn modify dictionary này, bạn cần khai báo nó những là một biến (với từ khóa var) hơn là một hằng (with let). Tuy nhiên bạn sẽ gặp một lỗi compiler.
3.        Đây là cách mà bạn thiết lập một item trong một dictionary. Những bạn thấy, nó đơn giản hơn cấu trúc trong Obj-C.
Cuối cùng sửa lại dòng cuối trong playground của bạn để gọi phương thức này:
tipCalc.returnPossibleTips()
Bạn sẽ thấy kết quả trả về là một dictionary trong inspector (click dii eyeball để nó mở rộng cái view xuống).
OK đã xong!

Where To Go From Here?
Đây là final playground file chưa toàn bộ source code của bài hướng dẫn này.
Bạn muốn học tiếp? Hãy đọc : next part of this series, ở đó bạn sẽ học cách tạo một user interface cho app này, hay check out new Swift bookscủa chúng tôi!
Tôi hi vọng bạn sẽ thích bài hướng dẫn này, và welcome bạn đã đến với thế giới Swift!