1. Trang chủ
  2. » Công Nghệ Thông Tin

Lập trình SWIFT cho IOS

46 359 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 46
Dung lượng 326,95 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Swift là một ngôn ngữ lập trình để phát triển app trên nền tảng iOS và Mac OS X. Nó được xây dựng dựa trên nền tảng C và Objective C tuy nhiên không hề bị rằng buộc về mặt phải được tương thích với C. Swift cũng tuân theo những pattern lập trình an toàn, nó cũng có những tính năng hiện đại có thể giúp cho việc lập trình với Swift trở nên dễ dàng và linh hoạt hơn.Swift được Apple giới thiệu vào tháng 6 năm ngoái. Ngôn ngữ này kế thừa những điểm mạnh của Objective C. Và hơn thế nữa, Swift có rất nhiều cải tiến về quản lý bộ nhớ, trình biên dịch và cú pháp lệnh. Nếu bạn đã từng được học qua Python thì bạn có thể thấy Swift có những nét tương đồng với Python (scripting language) dù Swift vẫn cần dùng tới trình biên dịch (compiler).

Trang 1

LẬP TRÌNH SWIFT

BÀI 1 SƠ LƯỢC VỀ NGÔN NGỮ LẬP TRÌNH SWIFT

Swift là một ngôn ngữ lập trình để phát triển app trên nền tảng iOS và Mac OS X Nó được xâydựng dựa trên nền tảng C và Objective C tuy nhiên không hề bị rằng buộc về mặt phải đượctương thích với C Swift cũng tuân theo những pattern lập trình an toàn, nó cũng có những tínhnăng hiện đại có thể giúp cho việc lập trình với Swift trở nên dễ dàng và linh hoạt hơn

Swift được Apple giới thiệu vào tháng 6 năm ngoái Ngôn ngữ này kế thừa những điểm mạnhcủa Objective C Và hơn thế nữa, Swift có rất nhiều cải tiến về quản lý bộ nhớ, trình biên dịch

và cú pháp lệnh Nếu bạn đã từng được học qua Python thì bạn có thể thấy Swift có những néttương đồng với Python (scripting language) dù Swift vẫn cần dùng tới trình biên dịch(compiler)

Bài này mình sẽ hướng dẫn sơ lược về ngôn ngữ lập trình này Các bài sau chúng sẽ đi vào ứngdụng cụ thể của Swift

1 Hàm main

Đối với Objective C, chúng ta luôn cần hàm main trong tất cả ứng dụng Tuy nhiên đối vớiswift (giống như một ngôn ngữ scripting) thì hàm main có thể được bỏ qua Ví dụ, bạn có thểviết:

1 Println(“Hello world”)

Đây hoàn toàn có thể là 1 chương trình hoàn thiện với chỉ một dòng lệnh duy nhất Chú ý khác

với Objective C chúng ta sẽ cần ký tự @trước mỗi một String tuy nhiên đối với Swift ký tự này

đã bị bỏ qua

2 Biến và hằng số

Để khai báo biến thì bạn dùng từ khoá var, còn đối với hằng bạn hãy dùng từ khoá let

Trang 2

Hãy để ý rằng Swift sẽ không yêu cầu bạn phải khai báo các kiểu giá trị khi dịch chương trình.Điều này cũng đồng nghĩa với việc các kiểu giá trị đều sẽ được xác định ở running time Nhưvậy nhiều khả năng Swift sẽ chạy không nhanh bằng Objective C vì Objective C đã xác địnhkiểu giá trị lúc biên dịch chương trình.

Bạn cũng có thể chỉ định kiểu giá trị khi khai báo biến hay hằng như sau:

1 let explicitDouble: Double = 70

Để thêm value vào string, bạn có thể sử dụng cách sau:

let appleSummary = "I have \(apples) apples."

let fruitSummary = "I have \(apples + oranges) pieces of fruit

var shoppingList = ["catfish", "water", "tulips", "blue paint"]

shoppingList[1] = "bottle of water"

var occupations = [

"Malcolm": "Captain",

"Kaylee": "Mechanic",

]

occupations["Jayne"] = "Public Relations

Hãy chú ý Objective C dùng ký hiệu {} để tạo ra Dictionary Với cả hai ngôn ngữ này thìchúng ta sử dụng chỉ số để truy cập thành phần mảng, dùng key để truy cập vào giá trị củadictionary

Để tạo ra được mảng rỗng hay dictionary rỗng, bạn có thể sử dụng ký tự dưới đây:

Trang 3

2let emptyArray = [String]()let emptyDictionary = [String: Float]()

Hay đơn giản hơn:

1

2

shoppingList = []

occupations = [:]

4 Điều khiển trong Swift.

Giống như những ngôn ngữ khác, Swift cũng có những điều khiển If, switch và những điềukhiển lặp như là while, do-while, và for Điều đặc biệt hơn đó là các dấu ngoặc tròn hoàn toàn

có thể bỏ qua, tuy nhiên những dấu ngoặc nhọn là bắt buộc:

Trang 4

Câu lệnh phía trên sẽ in ra giá trị 6 bởi vòng lặp chỉ chạy tới 3 Để cho vòng lặp chạy tới giá trịcận trên của range, bạn có thể dùng ký hiệu (…) thay vì < Điều này có thể là sự mở rộng củaPython bởi Python không cho phép bạn bao gồm cận trên trong vòng lặp for.

Vòng lặp do-while và while trong Swift cũng gần giống như trong những ngôn ngữ lập trìnhkhác Sau đây là ví dụ:

Một khái niệm rất mới mẻ trong Swift đó là Optional Optional có thể mang những giá trị thực

sự hay bằng nil Để khai báo 1 biến là optional chúng ta cần thêm dấu hỏi chấm:

var optionalName: String? = "John Appleseed"

var greeting = "Hello!"

if let name = optionalName {

//-your code goes here

}

Ở đoạn code trên, nếu hằng “name” có giá trị là nil thì đoạn code trong dấu ngoặc nhọn sẽkhông thể được thực hiện Như vậy nếu như bên trong bạn có một tham chiếu đến “name ” thìứng dụng sẽ không crash khi name=nil

Trang 5

Switch trong Swift sẽ là một cải tiến khá lớn Nó hỗ trợ rất nhiều kiểu dữ liệu (không chỉ làinteger như nhiều ngôn ngữ khác) và còn nhiều phép toán so sánh:

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)?"

Trang 6

BÀI 2 CƠ BẢN VỀ NGÔN NGỮ SWIFT (P2)

Ở bài trước chúng ta tìm hiểu khái niệm cơ bản của lập trình swift Và hôm nay mình sẽ tìmhiểu 1 số cái mới như hàm (function), closure và lớp (class) Kết thúc bài học hôm nay bạn sẽnắm được những điều căn bản của lập trình swift Bước đầu cảm nhận được sức mạnh và tínhlinh hoạt của ngôn ngữ lập trình này

func greet(name: String, day: String) -> String {

return "Hello \(name), today is \(day)."

func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {

var min = scores[0]

var max = scores[0]

Đặc biệt hơn, đối với tuple bạn hoàn toàn có thể truy cập những giá trị bằng 2 cách đó là sử

dụng chỉ số và sử dụng tên Đây chính là 1 lợi thế lớn so với kiểu Array thông thường Tương

tự với C++, Python và 1 số ngôn ngữ khác thì Swift cho phép hàm được khai báo với số lượngtham số đầu vào có thể thay đổi được Cụ thể như sau:

Trang 7

func makeIncrementer() -> (Int -> Int) {

func addOne(number: Int) -> Int {

Trang 8

func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {

for item in list {

numbers.map({ (number: Int) -> Int in

let result = 3 * number

return result

})

Closure có thể được đơn giản hoá như thế này:

1 let mappedNumbers = numbers.map({ number in 3 * number })

Việc dùng Closure hiệu quả sẻ làm cho app của bạn ngắn gọn hơn nhưng bạn sẽ cần thêm thờigian để làm quen với khái niệm này Closure sẽ được bàn kỹ hơn ở những bài sau nhé

2 Class trong Swift.

Giống với Java và C++ để có thể khai báo 1 lớp các bạn sử dụng từ khóa class Những đặc tính

và Method thành viên được khai báo 1 cách bình thường

Trang 9

func simpleDescription() -> String {

return "A shape with \(numberOfSides) sides."

var shapeDescription = shape.simpleDescription()

Bạn có thể thêm vào đó hàm init để khởi tạo được giá trị cho biến thành viên của lớp như sau:

var numberOfSides: Int = 0

var name: String

init(name: String) {

self.name = name

}

func simpleDescription() -> String {

return "A shape with \(numberOfSides) sides."

Trang 10

func area() -> Double {

return sideLength * sideLength

}

override func simpleDescription() -> String {

return "A square with sides of length \(sideLength)."

Giống như trong Objective-C, bạn có thể viết setter & getter cho bất kỳ một property nào của

1 class Bạn sử dụng từ khoá “set” cho setter & “get” cho getter Bạn cũng có thể sử dụngnhững method “willSet” và “didSet” để có thể chèn thêm vào 1 số đoạn code cần thiết trước &sau khi set giá trị cho 1 property Chi tiết về việc dùng setter và getter mình sẽ đề cập trongnhững phần tiếp theo

Một điểm bạn cần lưu ý đó là sự khác biệt giữa method được khai báo bên trong một lớp vàmột hàm Tham số đầu vào của hàm chỉ được dùng trong nội bộ hàm nhưng tham số củamethod có thể được dùng khi gọi method đó Mặt khác có thể khai báo thêm tên cho một tham

số như dưới đây:

var count: Int = 0

func incrementBy(amount: Int, numberOfTimes times: Int) {

count += amount * times

Trang 11

BÀI 3 CĂN BẢN VỀ LẬP TRÌNH SWIFT (P3)

Ở hai phần trước thì mình đã cùng các bạn tìm hiểu về hàm và class của Swift Hôm nay mình

sẽ giới thiệu 2 khái niệm khá cơ bản gồm Enumerations, Structures, Protocols và Extensions

Bài viết này sẽ là bài cuối cùng trong series bài giới thiệu về ngôn ngữ lập trình Swift Nhữngbài sau chúng ta sẽ tập trung vào cách dùng chi tiết cùng với những framework trong lập trìnhiOS

1 Enumerations

Trong Java, C, C++, Objective C hay các ngôn ngữ lập trình khác, kiểu enum dùng để khaibáo một tập giá trị cho trước, trong đó thì mỗi giá trị sẽ tương ứng với một số nguyên TrongSwift thì khái niệm enum lại được mở rộng ra với việc cho phép khai báo hàm trong enum.Hơn nữa, mỗi một giá trị trong enum đều không nhất thiết cần phải là số nguyên mà hoàn toàn

có thể là số thực, chuỗi (String), hoặc có thể không khai báo tường minh

Để khai báo ta sử dụng từ khoá “enum”

case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten

case Jack, Queen, King

func simpleDescription() -> String {

let ace = Rank.Ace

let aceRawValue = ace.toRaw()

Ở ví du jtrên thì kiểu giá trị là Int Vì vậy aceRawValue sẽ có giá trị là 1

Hãy chú ý là bạn sử dụng hàm toRaw (hoặc rawValue) và fromRaw để convert giữa giá trịenum và giá trị thực của nó (ở đây là Int)

Cùng xem đoạn code sau:

Trang 12

2

3

iflet convertedRank = Rank(rawValue: 11) {

let threeDescription = convertedRank.simpleDescription()

case Spades, Hearts, Diamonds, Clubs

func simpleDescription() -> String {

let hearts = Suit.Hearts

let heartsDescription = hearts.simpleDescription()

Code đoạn code phía trên rồi chạy trên 1 playground, bạn có thể được giá trị “hearts” cho hằngheartsDescription

Một điểm rất đặc biệt trong kiểu enum của Swift đó là nó sẽ cho phép khai báo thành viên nhưmột macro trong C++ Cùng xem qua đoạn code sau:

let success = ServerResponse.Result("6:00 am", "8:09 pm")

let failure = ServerResponse.Error("Out of cheese.")

Trang 13

caselet Result(sunrise, sunset):

let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."

Để có thể khai báo một cấu trúc, bạn hãy dùng từ khoá “struck” như sau:

var rank: Rank

var suit: Suit

func simpleDescription() -> String {

return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"

}

}

let threeOfSpades = Card(rank: Three, suit: Spades)

let threeOfSpadesDescription = threeOfSpades.simpleDescription()

var simpleDescription: String { get }

mutating func adjust()

}

Protocol khai báo method tuy nhiên nó lại không thưc hiện chúng Những method này sẽ đượcthực hiện trong lớp (class), cấu trúc (struct) hay enum Giả dụ:

Trang 14

class SimpleClass: ExampleProtocol {

var simpleDescription: String = "A very simple class."

var anotherProperty: Int = 69105

let aDescription = a.simpleDescription

struct SimpleStructure: ExampleProtocol {

var simpleDescription: String = "A simple structure"

mutating func adjust() {

let bDescription = b.simpleDescription.

Chú ý rằng trong cấu trúc SimpleStructure thì chúng ta dùng từ khoá “mutating” để có thể chophép method “adjust” thay đổi giá trị của biến thành viên của cấu trúc đó, trong khi đó class

“SimpleClass” không cần sử dụng tới từ khoá này Nguyên nhân là do instance của cấu trúcluôn luôn được copy khi truyền, cò class thì luôn được truyền bằng tham trị (reference)

Extension chính là cách thêm chức năng tới 1 kiểu đang tồn tại (tương tự như category trongObjective C) Ví dụ sau đây thêm method “simpleDescription” và “adjust” cho kiểu Int:

extension Int: ExampleProtocol {

var simpleDescription: String {

return "The number \(self)"

Một điều khá là thú vị đó là bạn hoàn toàn có thể khai báo 1 biến/hằng với kiểu là 1 protocol Ở

ví dụ trước chúng ta đã khai báo protocol tên là “ExampleProtocol” Giờ thì bạn có thể viết:

Trang 15

2let protocolValue: ExampleProtocol = aprotocolValue.simpleDescription

Giá trị “a” ở đây thông thường sẽ là instance của class hay structure đã thực hiện protocol

“ExampleProtocol” Nhưng “protocolValue” chỉ có thể gọi được những hàm đã được khai báotrong “ExampleProtocol” mà không thể gọi được những hàm riêng của class hay structure

4 Generics

Giống với Java và C++, Swift cũng đưa ra khái niệm về Generic Để khai báo Generic chúng ta

sẽ dùng dấu <> như sau:

func repeat<ItemType>(item: ItemType, times: Int) -> [ItemType] {

var result = [ItemType]()

Trang 16

BÀI 4 SỬ DỤNG KIỂU ENUM TRONG LẬP TRÌNH SWIFT

So với các kiểu enum truyền thống trong Java, C++ hay Objective-C thì kiểu enum trong Swift

có rất nhiều đổi thay Qua bài viết hôm nay, chúng ta sẽ tìm hiểu sâu hơn về kiểu enum qua đóchúng ta có thể áp dụng nó một cách hiệu quả nhất

1 Khai báo kiểu enum

Để khai báo 1 kiểu enum thì bạn sử dụng từ khoá “enum” cùng với những dấu ngoặc nhọn Giảdụ:

Sự khác biệt với những kiểu enum truyền thống đó là ở chỗ những giá trị như East, West, South

và North không tương xứng với những số nguyên Trái lại, các bạn sẽ thấy ở phần sau rằngchúng ta hoàn toàn có thể chỉ định được giá trị đơn (raw value) hay giá trị liên hợp cho chúng.Bạn cũng cần để ý rằng dấu phẩy cũng đã được bỏ đi trong khai báo enum của Swift

Những thành viên của kiểu enum hoàn toàn có thể nằm phía trên cùng một dòng và ngăn cáchnhau bằng dấu phẩy:

Trang 17

Sau đó do kiểu của onedirection đã biết, chúng ta có thể viết:

1 onedirection = West

2 Sử dụng kiểu enum cùng với câu lệnh Swift

Tiếp tục ví dụ trên, khi biến onedirection đã được suy luận kiểu hoặc khi sử dụng trong câulệnh Switch, chúng ta hoàn toàn có thể lược bớt phần tên kiểu enum và chỉ giữ lại tên của thànhviên (member) của kiểu enum đó:

3 Giá trị liên hợp trong kiểu enum

Như ở phần 3 chúng ta đã đề cập thì trong kiểu enum ta có thể khai báo 1 loại cú pháp giốngnhư Macro trong C++ Đây cũng chính là kiểu giá trị liên hợp (associated value) sử dụng trongenum Swift Mục đích của nó chính là khai báo mỗi thành viên như là một tập các giá trị cómối quan hệ với nhau Cùng theo dõi ví dụ sau:

Trang 18

Kiểu enum phía trên khai báo 2 thành viên tương ứng với bar code 1D và QR code (2D).

Thành viên thứ nhất chính là giá trị liên hợp bao gồm 4 số nguyên, trong khi đó thành viên thứ

2 cũng chính là giá trị liên hợp tuy nhiên lại chỉ bao gồm duy nhất 1 chuỗi ký tự

Để có thể tạo ra một bar code mới, chúng ta sử dụng cú pháp sau:

1 var barcode = BarCode.UPCA(1, 59000, 10000, 8)

sau đó có thể gán:

1 barcode = BarCode.QRCode(“This is a URL”)

Khi sử dụng trong câu lệnh Switch, để dùng những giá trị liên hợp thì ta cần phải khai báohằng hay biến tương ứng:

case BarCode.UPCA(let systemNum, let manufacturerNum, let productNum, let checkNum):

println(“Manufacture number is \(manufacturerNum)”)

case BarCode.QRCode(let codedStr):

println(codedStr)

}

Nếu như khai báo mọi giá trị liên hợp cùng là hằng hay biến, chúng ta có thể xài cú pháp rútgọn như sau:

Trang 19

case let BarCode.UPCA(systemNum, manufacturerNum, productNum, checkNum):

println(“Manufacture number is \(manufacturerNum)”)

case var BarCode.QRCode(codedStr):

println(codedStr)

}

4 Giá trị đơn trong kiểu enum

Khi khai báo theo kiểu enum có thể chỉ định giá trị default cho mọi thành viên (member) của

nó Giá trị này được chỉ định cho member là những giá trị đơn (raw values) Giá trị đơn cũng

có thể là String, Int, Float, Character… Chẳng hạn:

Nếu như kiểu enum gồm những thành viên có kiểu Int thì những thành viên cách nhau một đơn

vị (hoàn toàn giống với kiểu enum truyền thống):

1

2

3

enum Planet: Int {

case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune

}

Với khai báo trên, Planet.Venus sẽ có giá trị là 2

Để truy cập giá trị đơn, chúng ta sẽ sử dụng cú pháp sau:

1 let earthsOrder = Planet.Earth.rawValue

Trang 20

1 let possiblePlanet = Planet(rawValue: 7)

Tuy nhiên chúng ta cũng cần lưu ý rằng kiểu trả về của hàm tạo này là optional vì dải giá trịcủa kiểu enum không nhất thiết chứa tham số đầu vào của hàm này, do vậy cần lưu ý khi sửdụng để tránh crash chương trình

5 Khai báo hàm trong kiểu enum

Ở đây mình chỉ nhắc lại về việc khai báo hàm trong kiểu enum Trong enum, chúng ta có thểkhai báo hàm, và hàm này cũng có thể được gọi từ những member của kiểu enum đó Chẳnghạn:

case Spades, Hearts, Diamonds, Clubs

func simpleDescription() -> String {

let hearts = Suit.Hearts

let heartsDescription = hearts.simpleDescription()

6 Tổng kết.

Qua bài viết ngày hôm nay, chúng ta đã học được cách khai báo và sử dụng kiểu enum tronglập trình Swift So với kiểu các enum truyền thống thì enum trong Swift đã tiến hoá hơn và trởnên mềm dẻo, hữu dụng và mạnh mẽ hơn Đáng chú ý nhất chính là việc nó hỗ trợ kiểu giá trịliên hợp và khai báo hàm Trong những bài sau, các tính năng của Swift sẽ lần lượt được thảoluận chi tiết

Trang 21

Bài 5 [HÀM ĐIỀU KHIỂN] – CẤU TRÚC LẶP TRONG LẬP TRÌNH SWIFT

Chào các bạn, hôm nay chúng ta sẽ tìm hiểu về cấu trúc lặp trong lập trình Swift, cách hoạt

động và cách dùng của những hàm điều khiển căn bản trong Swift

Vòng lặp là 1 mã lệnh mà trong đó chương trình sẽ được thực hiện lặp đi lặp lại nhiều lần cho

đến khi nó thỏa mãn 1 điều kiện nào đó

• <khai báo>: khai báo và gán thêm giá trị cho biến đếm

• <biểu thức 1>: điều kiện để có thể dừng vòng lặp

• <biểu thức 2>: thay đổi giá trị biến đếm

Vòng lặp for-in thường được dùng khi biết trước về số lần lặp Vòng lặp for-in sẽ sử dụng một

biến đại diện cho từng vị trí tương ứng tại thời điểm lặp để có thể lấy ra giá trị bên trong của

Trang 22

• <biến>: sẽ đại diện cho phần tử có những vị trí tương ứng tại một thời điểm lặp

• <đối tượng>: nó có thể là một mảng, một từ điển hay một dãy số cho trước Giả dụ:

for (x,y) in tudien {

println("Thu nhập trong \(x) là \(y)")

• Tuỳ từng trường hợp mà chúng ta có thể dùng for hay for-in, tuy nhiên hầu hết khichúng ta làm việc với Array/Dictionary thì đều sử dụng for-in

Trang 23

• Vòng lặp for/for-in thường được dùng khi ta đã biết trước được số lần lặp.

• Ta có thể đặt vòng lặp for/for-in bên trong một vòng lặp for/for-in khác, được gọi là 2vòng lặp for lồng nhau

3 Vòng lặp While

Khi thoả mãn những điều kiện thì cậu lệnh trong vòng lặp while sẽ được thực hiện Vòng lặpwhile sẽ luôn kiểm tra các điều kiện ngay từ đầu, nếu như điều kiện sai thì câu lệnh trong vònglặp while sẽ không được thực hiện nữa

• <điều kiện>: biểu thức điều kiện để giúp câu lệnh thực hiện

• <câu lệnh 1>: nhóm câu lệnh cần thực hiện

• <câu lệnh 2>: câu lệnh để đổi lại giá trị so sánh của những biểu thức điều kiện Sau mỗimột lần lặp thì giá trị phải tiến gần tới điều kiện để có thể dừng vòng lặp, nếu không thìvòng lặp sẽ lặp vô tận

Ngày đăng: 15/08/2017, 19:34

TỪ KHÓA LIÊN QUAN

w