Swift là một ngôn ngữ lập trình cho nền tảngtảng IOS. Nó khác với Objective-C khá nhiều: có nhiều cải tiến hết sức mạnh mẽ, nhưng lại có một số hạn chế, chắc chắn Apple đang làm việc cật lực để khác phục. XCode 6.1.1 vẫn còn nhiều bất cập khi biên dịch ứng dụng viết bằng Swift. Ví dụ điển hình là bộ parser ngôn ngữ Swift không ổn định như Objective-C nên thỉnh thoảng SourceKit lại treo, mã Swift không được highlight định dạng đúng màu sắc. Trong một số trường hợp, biên dịch mã Swift rất chậm
Trong bài viết này, tôi chỉ ra một số tip để tối ưu tốc độ khi biên dịch (compile time) và chạy (run time).
Khai báo tường minh vs suy diễn kiểu – Type explicit declaration vs Type inference
Trong Swift, dev có thể khai báo biến không cần định rõ kiểu, trình biên dịch sẽ tự suy diễn ví dụ
let name = “Michael Jordan” //Tự chuyển sang kiểu String, quá rõ ràng rồi.
Tuy nhiên điều này lại gây cho Swift compiler rất nhiều phiền toái để nhận dạng kiểu dữ liệu phức tạp (Array và Dictionary trộn lẫn nhau) xem nó thuộc về kiểu nào.
Đoạn code dưới đây khiến XCode mất vài chục giây để xử lý. Biến simpleIO tự suy diễn kiểu
func badDeclare() {
var simpleIO = [SECTION: "Simple IO",MENU:[
[TITLE: "Read from plist",CLASS: "ReadPlist"],
[TITLE: "Write to plist",CLASS: "WritePlist"],
[TITLE: "Read/Write NSUserDefaults",CLASS: "ReadWriteNSUserDefaults#Storyboard"],
[TITLE: "NSCoding",CLASS: "NSCodingDemo"],
[TITLE: "Key Value Observer (KVO)",CLASS: "KVODemo"],
[TITLE: "Notification Center",CLASS: "NotificationDemo"]
]
]
}
Đoạn code dưới đây, khai báo kiểu dữ liệu tường minh, giúp XCode compiler chạy nhanh hơn rất nhiều. Biến simpleIO khai báo tường minh là NSDictionary
func goodDeclare() {
var simpleIO = [SECTION: "Simple IO",MENU:[
[TITLE: "Read from plist",CLASS: "ReadPlist"],
[TITLE: "Write to plist",CLASS: "WritePlist"],
[TITLE: "Read/Write NSUserDefaults",CLASS: "ReadWriteNSUserDefaults#Storyboard"],
[TITLE: "NSCoding",CLASS: "NSCodingDemo"],
[TITLE: "Key Value Observer (KVO)",CLASS: "KVODemo"],
[TITLE: "Notification Center",CLASS: "NotificationDemo"]
]
] as NSDictionary //Cuong: must explicitly declare as NSDictionary to speed up compiling
}
hoặc khai báo cách này cũng ok
var simpleIO: [String: AnyObject] = [SECTION: "Simple IO",MENU:[
[TITLE: "Read from plist",CLASS: "ReadPlist"],
[TITLE: "Write to plist",CLASS: "WritePlist"],
[TITLE: "Read/Write NSUserDefaults",CLASS: "ReadWriteNSUserDefaults#Storyboard"],
[TITLE: "NSCoding",CLASS: "NSCodingDemo"],
[TITLE: "Key Value Observer (KVO)",CLASS: "KVODemo"],
[TITLE: "Notification Center",CLASS: "NotificationDemo"]
]
]
Tối ưu khi cộng chuỗi String
Có vài cách để cộng chuỗi trong IOS Swift:
- Sử dụng toán tử cộng gán +=. Chạy nhanh nhất
- Sử dụng tính năng nội suy chuỗi, string interpolation, rất giống hàm printf. Viết đẹp gọn, nhưng chạy chậm nhất
- Sử dụng NSMutableString.append. Chạy nhanh thứ nhì
func stringAdd(a: String, b: String, c: String, d: String) -> String {
var result: String = a
result += b
result += c
result += d
return result
}
func stringAppend(a: String, b: String, c: String, d: String) -> String {
var result = NSMutableString(string: a)
result.appendString(b)
result.appendString(c)
result.appendString(d)
return result as String
}
func stringInterpolate(a: String, b: String, c: String, d: String) -> String {
return "\(a)\(b)\(c)\(d)"
}
Tự benchmark các hàm chạy đồng bộ trong Swift
Chú ý đoạn code này chỉ do thời gian chạy đoạn code chạy tuần tự trong cùng một thread.
let startTime = NSDate()
NSThread.sleepForTimeInterval(1)
let timeEllapse = -startTime.timeIntervalSinceNow
Tham khảo full source code ở đây
Khóa học lập trình di động tại Techmaster:
Để cài đặt MacOSX lên phần cứng không phải Apple liên hệ chuyên gia cài Hackintosh:
- Nguyễn Minh Sơn: 01287065634
- Huỳnh Minh Sơn: 0936225565
- Website: caidatmacos.com
Bình luận