JVA đi học swift

Với một developer đã học một ngôn ngữ nào đó rồi thì việc học thêm một ngôn ngữ mới sẽ như thế nào? Hiện tại swift đang là ngôn ngữ khá được ưa chuộng, với một Java developer mình muốn chia sẻ cảm nhận của bản thân khi học swift sẽ như thế nào.

Ấn tượng ban đầu

Trong swift không thấy cái dấu ; nào cả :v Việc khai báo biến hay hàm đề có một biến đầu tiên để phân biệt với từ khoá như var trước mỗi biến, let dùng để khai báo cho hằng số, hay func trước mỗi hàm. var singleLetter:Character = "A" cũng khá đơn giản, sau tên biến thì có thể khai báo một cách tường minh kiểu dữ liệu

String và Character

Là kiểu dữ liệu được dùng phổ biến, nó có gì khác so với java? var singleLetter:Character = "F" giống như kiểu char trong java , nhưng ở đây giá trị lại được đặt trong nháy kép giống như kiểu String vậy, không nhất thiết phải đặt trong nháy đơn. var stringValue:String = "stringValue" var letters:[Character] = ["C", "A","R", "T","O", "O"] var website:String = String (letters) việc chuyển từ mảng Character sang String khá đơn giản, cú pháp cũng giống như cách ép kiểu bên java vậy. việc đếm số ký tự của String thì có vẻ rườm rà hơn một chút website.characters.count khi phải thêm một bước .characters.count, java thì đơn giản chỉ là stringValue.length. Các thao tác với String như in hoa, chữ thường, thì cũng tương tự như java chỉ khác chút tên hàm thôi. website.lowercased() website.uppercased() website.capitalized việc kiểm tra ký tự có tồn tại trong chuỗi. if ( website.range(of: ".com") != nil ) như trong java thì string1.contains(string2) như vậy thì swift ngoài cái tên hàm khác còn có từ khoá of. Việc check prefix and suffix cũng khá đơn giản website.lowercased().hasPrefix("car") website.lowercased().hasSuffix("car") cũng không khác java là mấy stringValue.startWith("start") stringValue.endWith("start") vậy việc convert từ String qua các kiểu dữ liệu khác thì sao let someNumber:Int = Int(someNumberString)! khá đơn giản nhỉ, thay vì dùng các hàm parse như trong java.

Array

var swiftArray = String hay swiftArray = ["CartoonSmart.com" , "Shameless Plug", "Best Tutorials for Swift 3"] swiftArray.append("Tutorials") swiftArray.append("More Tutorials") swiftArray.remove(at: 0) swiftArray.removeAll()

dù cách khai báo khá giống với các mảng có độ dài cố định bên java nhưng nó lại dùng như là một List, có thể thêm, xoá trong mảng.

Function and parametter

func addToScore(points:Int, money:Float){   score = score + points     currency = currency + money

}

nếu có giá trị trả về func canStillPlayGame() -> Bool {          if ( playerLives == 0){        return false              } else {         return true     } }

cũng như khai báo biến thì function cũng có từ khoá func trước mỗi hàm còn giá trị trả về thì lại được để sau cùng sau dấu mũi tên. Có một điếm khá thú vị là trong swift một hàm có thể trả về giá trị cùng một lúc thay vì phải dùng Map, List, Hay là tạo ra một đối tượng chứa các giá trị trả về như trong Java func calculateStatistics ( scores:[Int] ) -> (min:Int, max:Int, sum:Int) {         var min = scores[0]   var max = scores[0]     var sum = 0     for score in scores {         if (score > max) {             max = score         } else if (score < min) {             min = score                     }         sum = sum + score     }         return (min, max, sum) }

Vòng lặp

for i in 0 ..< 10 {     print (i) }

for i in 0 ... 10 {     print (i) }

Khá thú vị với cách dùng dấu … hay ..< thay vì for (int i, i = 0, i = 10) hay for (int i, i = 0, i < 10)

for name in names {     print (name) }

việc lặp trong một list đối tượng thì không khác gì java ngoài không cần dùng () trong for.

while i < 100 {   print(i)     i += 1 } với vòng lặp while cũng vậy.

Cách dùng random

let randomNum:UInt32 = arc4random_uniform(100) // range is 0 to 99   // convert the UInt32 to some other  types   let randomTime:TimeInterval = TimeInterval(randomNum)   let someInt:Int = Int(randomNum)   let someString:String = String(randomNum)

sau khi lấy giá trị kiểu UInt32 thì sẽ convert ra kiểu dữ liệu mong muốn. Thay vì dùng Instance của Random để lấy giá trị trực tiếp cho từng kiểu thông qua các hàm riêng trả về các kiểu dữ liệu khác nhau, hay dùng class Math.random để lấy về giá trị kiểu double.

Dictionaries

var someDict = String : AnyObject  //could use Any or AnyObject here   // add a key and value   someDict["Ex wives"] = 5   print (someDict)   // add another key and value   someDict["Current wives"] = 1   print (someDict)   //remove Current wives. Oh well.   someDict.removeValue(forKey: "Current wives")   print (someDict)   //changes ex wives to 6   someDict["Ex wives"] = 6   print (someDict)   // remove all   someDict.removeAll()

Giống như kiểu Map trong java vậy, có điêu cách thêm key, value lại giống như một Mảng.

Việc tương tác với giá trị của Dictionaries var someDict = ["Current Zip Code" : 34050, "Previous Zip Code" : 43256, "Next Zip" : "the moon"]   var someString:String = "" // will use later...   for (theKey, theValue) in someDict {       //iterate through the dictionary until we find the previous zip code       if (theKey == "Previous Zip Code") {           //check what the value type is before doing anything with it           if let possibleNumber:Int  = theValue as? Int {               //possibleNumber was successfully created equaling theValue              print (possibleNumber)           }       }       // another approach...        else if (theKey == "Next Zip") {           //check if its a string...           if (theValue is String) {               //it's safe to force someString to equal theValue since               // we know it's definitely a string...               someString = theValue as! String           }       }   }

Lợi thế của việc truyền nhiều biến cùng lúc trong vòng lặp khi có thể lấy giá trị của key và value cùng một lúc. Đây chỉ là một sỗ chỗ mình tìm hiểu qua, nên sẽ có nhiều chỗ sai sót. Hi vọng sẽ nhận được nhiều góp ý bổ sung.