[{"content":"Đã có rất nhiều bàiviết về Blockchain, nhưng mình muốn giảithích sao cho 1 họcsinh THPT cũng cóthể hiểu được. Như Albert Einstein đã nói \u0026amp;ldquo;If you can\u0026amp;rsquo;t explain it simply, you don\u0026amp;rsquo;t understand it well enough.\u0026amp;rdquo;\nVấnđề và cách giảiquyết Hãy xemxét 1 giaodịch chuyển tiền của A cho B trong cùng ngânhàng :bank:.\nCó 1 vài vấnđề như sau:\nTiền trong tàikhoản của A có đủ không mà đòi chuyển? Nếu đủ, thì làm sao đảmbảo chỉ với số tiền đó, A sẽ không thamlam mà chuyển nhiều lần cho nhiều người. (vấn đề nổitiếng này là double-spending) Làm sao đảmbảo người gửi tiền đúng là A mà không phải ai khác? (Vídụ: Nhânviên ngânhàng làm bậy thì sao?) Vaitrò giảiquyết 3 vấnđề trên đều giao cho ngânhàng :bank: (tổngquát hơn là bên-thứ-3 làm trunggian)\nNếu bỏ luôn vaitrò của ngânhàng :bank: trong vídụ trên, làm sao để giảiquyết 3 vấnđề trên.\nLấy 1 vídụ nữa, để giảiquyết 3 vấnđề trên mà không cần tới ngânhàng :bank:.\nCó 7 bạn (A , B , C , D , E , F , G) (tạisao là 7, vì mình thích số 7 nhất …","date":"2017-12-12","href":"/vi/posts/0015blockchainlagi/","section":"posts","summary":"Đã có rất nhiều bàiviết về Blockchain, nhưng mình muốn giảithích sao cho 1 họcsinh THPT cũng cóthể hiểu được. Như Albert Einstein đã nói \u0026ldquo;If you can\u0026rsquo;t explain it simply, you don\u0026rsquo;t …","title":"Blockchain là gì"},{"content":"Bạn cóthể google và đọc nhiều bàiviết về nó, nhưng mình có cách tiếpcận khác một chút, thúvị hơn. Hãy cùng điềutra với mình nào.\nMụcđích của việcđiềutra này Tìmhiểu lịchsử rađời của Bitcoin. Chứngminh, Satoshi đã cốgắng giảiquyết vấnđề đã tồntại từ rất lâu rồi. Chứ không phải ngẫunhiên mà “một ngày đẹp trời, Satoshi ngồi nghĩ chơi chơi rồi viết ra Bitcoin” Qua quátrình này, cũng cóthể giúp bạn tự mình tìmhiểu thêm để kiểmchứng lại. Quátrình điềutra Bắtđầu nào, google ra wikipedia.\nTheo wikipedia, ngày 31/10/2008 một nickname Satoshi Nakamoto đã xuấtbản 1 nghiêncứu với tựa đề là \u0026amp;ldquo;Bitcoin: A Peer-to-Peer Electronic Cash System\u0026amp;rdquo;\nTới đây có 2 câuhỏi xuấthiện:\nSatoshi Nakamoto đã cho xuấtbản cái này ởđâu ? (để tìmkiếm các nghiêncứu khác đọc chơi thôi :D) Nộidung của bảnnghiêncứu đó là gì? Bảnnghiêncứu đó đây\nĐọc bảnnghiêncứu thấy toàn vấnđề kỹthuật, kinhtế ? (mơ hồ chưa). Mình tạm bỏqua nộidung, chỉ quantâm nó được tạora nhưthếnào nên mình quantâm đến mục References số [1]\nThêm …","date":"2017-12-08","href":"/vi/posts/0014lichsubitcoin/","section":"posts","summary":"Bạn cóthể google và đọc nhiều bàiviết về nó, nhưng mình có cách tiếpcận khác một chút, thúvị hơn. Hãy cùng điềutra với mình nào.\nMụcđích của việcđiềutra này Tìmhiểu lịchsử rađời của Bitcoin. …","title":"Bitcoin được tạo ra như thế nào?"},{"content":"Tìnhhình HDD bị lỗi gì đó mà ko boot vào MacOS được nên mình đổi HDD luôn. Càilại iTerm nên ghi lại đây, sau này ko mất công tìmkiếm nữa và cho những ai đang cần hehe.\nKhi hoànthành iTerm sẽ nhìn nhưthếnày Bước 1 - Càiđặt iTerm Vào đây để download\nBước 2 - Càiđặt oh-my-zsh Mở iTerm lên và paste dòng lệnh sau: [0]\nsh -c \u0026amp;#34;$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)\u0026amp;#34; Bước 3 - Càiđặt theme cho iTerm Paste dòng lệnh sau vào iTerm: [1]\ngit clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k Lệnh này có tácdụng download powerlevel9k và lưu vào theo đườngdẫn ~/.oh-my-zsh/custom/themes/\nĐể sửdụng theme vừa download, vào file này ~/.zshrc và ở dòng 10 sửa như sau: ZSH_THEME=\u0026amp;quot;powerlevel9k/powerlevel9k\u0026amp;quot;\nBước 4 - Càiđặt font cho iTerm Download font này về và double click để cài font\nVào Preference của iTerm, chọn Profile -\u0026amp;gt; Text và change Font mới càiđặt.\nCũng ở mục Profiles, chọn Colors …","date":"2017-10-15","href":"/vi/posts/0013itermcofigureptv/","section":"posts","summary":"Tìnhhình HDD bị lỗi gì đó mà ko boot vào MacOS được nên mình đổi HDD luôn. Càilại iTerm nên ghi lại đây, sau này ko mất công tìmkiếm nữa và cho những ai đang cần hehe.\nKhi hoànthành iTerm sẽ nhìn …","title":"Cài đặt Oh My Zsh và trang trí cho iTerm bằng powerlevel9k"},{"content":"ℹ️ Bài này được mình dịch từ đây Apple đã có một bài báo về strong reference cycles trong class. Không khó hiểu sự rò rỉ bộ nhớ (memory leak) là gì và làm thế nào để tránh trong trường hợp này. Tuy nhiên, đây là một tình huống khá hiếm, và dễ dàng phát hiện được. Tôi sẽ chú ý về closure với nhiều chỗ khó hiểu hơn. Vì vậy, hãy làm rõ điều này một lần và cho sau này nữa.\nVòng tham chiếu với closures Trước tiên, bạn phải hiểu closure là gì và những gì nó làm. Tôi hình dung nó như một đoạn code, nó như một class tạm thời có chứa một tham chiếu đến tất cả các đối tượng nó cần.\nHãy lấy một ví dụ đơn giản để bắt đầu: một ViewController có một CustomView. CustomView có một closure được gọi khi button được nhấn.\nclass CustomView:UIView{ var onTap:(()-\u0026amp;gt;Void)? ... } class ViewController:UIViewController{ let customView = CustomView() var buttonClicked = false func setupCustomView(){ var timesTapped = 0 customView.onTap = { timesTapped += 1 print(\u0026amp;#34;button tapped \\(timesTapped) times\u0026amp;#34;) …","date":"2017-03-13","href":"/vi/posts/0012timhieuroribonhotrongclosure/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây Apple đã có một bài báo về strong reference cycles trong class. Không khó hiểu sự rò rỉ bộ nhớ (memory leak) là gì và làm thế nào để tránh trong trường hợp này. Tuy …","title":"Tìm hiểu rò rỉ bộ nhớ trong closure"},{"content":"ℹ️ Bài này được mình dịch từ đây Ở bài trước, chúng ta đã biết sự phức tạp và rắc rối của controller, điều này giải thích vì sao MVC lại có nickname \u0026amp;ldquo;Massive ViewController\u0026amp;rdquo;\nChúng ta hướng tới một ứng dụng với các mô-đun, dễ dàng bảo trì, khả năng mở rộng ứng dụng và nó thường đi kèm với vấn đề của nó. Một phần của vấn đề này có thể sửa đổi bằng cách bỏ kiến trúc MVC chuyển sang MVVM, với những công cụ trợ giúp.\nMột trong số đó là luồng điều hướng phức tạp, không chỉ làm chậm quá trình phát triển của ứng dụng, mà còn làm cho code khó debug hơn.\nMay thay, là đã có Coordinator\nLàm thế nào để ViewController phát triển thành quái vật? Hãy xem đoạn code điều hướng tiêu chuẩn, như template của Apple là Master-Detail:\nextension MasterVC: UITableViewController { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let detailData = getDetailData(indexPath: indexPath) let detailVC = DetailVC() detailVC.detailData = detailData …","date":"2017-03-10","href":"/vi/posts/0011dieukhienluongungdungvoi-coordinators/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây Ở bài trước, chúng ta đã biết sự phức tạp và rắc rối của controller, điều này giải thích vì sao MVC lại có nickname \u0026ldquo;Massive ViewController\u0026rdquo;\n","title":"Sử dụng Coordinator để điều khiển App Flow trong mô hình MVVM-C"},{"content":"ℹ️ Bài này được mình dịch từ đây Việc lựa chọn đúng cho mô hình kiến trúc của app là một nhiệm vụ quan trọng.\nKiến trúc tốt sẽ giúp cho việc sửa lỗi được dễ dàng, thêm tính năng mới, và giúp đẩy nhanh tốc độ phát triển phần mềm, mà chi phí phát triển ít hơn, cả trong ngắn hạn và dài hạn.\nVới những lý do trên, MVVM (hoặc MVVM-C) có vẻ tốt cho chúng ta, và chúng sẽ giải thích cách sử dụng nó như thế nào. Nhưng trước tiên, hãy đi qua lý do để chúng ta quyết định không dùng kiến trúc MVC của Apple cung cấp.\nNhững vấn đề với MVC Từ khi iOS được tạo dựa trên mô hình kiến trúc MVC, nó có vẻ luôn là sự lựa chọn đầu tiên, và ngay cái nhìn đầu tiên nó không đủ sự đơn giản.\nMô hình phân chia phần mềm thành 3 phần khác nhau, trong đó Model đại diện cho data, View đại diện cho giao diện người dùng (user interface) và Controller hoạt động như chất keo kết dính giữa 2 phần còn lại. Điều này có vẻ rõ ràng, nhưng các ứng dụng ngày càng phức tạp, cách tiếp cận này cho thấy những thiếu sót của nó.\nNhư …","date":"2017-03-06","href":"/vi/posts/0010mo-hinh-kien-truc-mvvm-huongdantungbuoc/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây Việc lựa chọn đúng cho mô hình kiến trúc của app là một nhiệm vụ quan trọng.\n","title":"Kiến trúc MVVM: hướng dẫn Step-by-Step"},{"content":"ℹ️ Bài này được mình dịch từ đây. Image credit: Stanford University CS193P, Fall-2010\nNếu bạn là một iOS developer hoặc là developer nói chung, bạn chắn chắn sẽ phải giải quyết vấn đề này trong hầu hết dự án: Làm thế nào để truyền data từ Model đến Controller\n✅ Bài viết này giả sử, bạn sử dụng mô hình MVC hoặc MVVM trong project của bạn. Nếu code của bạn xử lý các việc như: requesting, receiving, passing data, updating UI đều nằm trong file UIViewController duy nhất, bạn nên áp dụng một trong các mô hình kiến trúc iOS (iOS Architecture Patterns) trước đã. Tôi sẽ mô tả 3 cách cơ bản để truyền data trở lại cho Controller của bạn:\nSử dụng Callbacks Sử dụng Delegation Sử dụng Notifications Chúng ta sẽ đi qua lần lượt khái niệm của 3 cách trên, sau đó là ví dụ step-by-step. Đến cuối bài này bạn sẽ có thể chọn cách nào phù hợp nhất cho dự án của bạn.\nBắt đầu, chúng ta sẽ tạo 1 project cơ bản có ViewController và DataModel. Tại bước này, không quan trọng về nguồn data của bạn. Nó có thể là …","date":"2017-03-02","href":"/vi/posts/0009three-ways-to-pass-data-from-model-to-controller/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây. Image credit: Stanford University CS193P, Fall-2010\n","title":"Ba cách để truyền data từ Model đến Controller"},{"content":"ℹ️ Bài này được mình dịch từ đây\nBài dịch phần 1.\nMVVM Mới nhất và tuyệt vời nhất trong mô hình MV(X) MVVM là mới nhất trong kiểu MV(X), hãy hy vọng nó sẽ giải quyết được các vấn đề mà MV(X) đối mặt trước đây.\nVề lý thuyết Model-View-ViewModel rất tốt. View và Model đã quen thuộc với chúng ta, nhưng còn phần trung gian, là ViewModel.\nMVVM\nNó khá giống với MVP:\nMVVM xử lý ViewController như là View. Không có liên kết chặt chẽ giữa View và Model. Ngoài ra, nó binding giống như phiên bản Supervising của MVP. Tuy nhiên, không phải giữa View và Model mà là giữa View và ViewModel.\nCác ViewModel trong iOS thực tế là gì? Đó là UIKit đại diện cho View và các state của nó. ViewModel sẽ gọi ra những thay đổi trong Model và cập nhật chính nó với bản Model mới cập nhật và chúng ta có 1 binding giữa View và ViewModel.\nBindings Tôi đã giới thiệu vắn tắt trong phần MVP, nhưng chúng ta hãy thảo luận một chút ở đây. Bindings được lấy ra từ quá trình phát triển phần mềm của OSX, nhưng chúng ta không có …","date":"2017-02-27","href":"/vi/posts/0008ios-architecture-patterns-phan-2/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây\nBài dịch phần 1.\nMVVM Mới nhất và tuyệt vời nhất trong mô hình MV(X) MVVM là mới nhất trong kiểu MV(X), hãy hy vọng nó sẽ giải quyết được các vấn đề mà MV(X) đối mặt …","title":"Mô hình kiến trúc iOS (phần 2)"},{"content":"ℹ️ Bài này được mình dịch từ đây\nBài dịch phần 2\nBạn có cảm thấy lạ khi thực hiện MVC trong iOS? Bạn có những nghi ngờ về việc chuyển sang MVVM? Bạn có nghe nói về VIPER, nhưng không chắc rằng nó có xứng đáng không?\nTiếp tục đọc, và bạn sẽ tìm thấy câu trả lời cho những câu hỏi trên, nếu bạn không tìm thấy hãy comment bên dưới\nBạn muốn ôn lại kiến thức của mình về các mô hình kiến trúc (architectural patterns) trong môi trường iOS. Chúng ta sẽ đánh giá ngắn gọn một số loại phổ biến và so sánh chúng trong lý thuyết và thực hành thông qua một vài ví dụ nhỏ. Hãy nhấn vào liên kết nếu bạn cần biết thêm thông tin chi tiết về bất kỳ loại nào.\nNắm vững nhiều mẫu thiết kế có thể gây nghiện, vì vậy hãy cẩn thận: bạn có thể sẽ tự hỏi nhiều câu hỏi hơn so với trước khi đọc bài viết này, kiểu như:\nBộ phận nào phải gửi networking request: Model hay Controller? Làm cách nào để truyền Model đến ViewModel của View mới? Bộ phận nào tạo ra một mô-đun VIPER mới: Router hay Presenter?\nTại sao phải quan …","date":"2017-02-24","href":"/vi/posts/0007ios-architecture-patterns-phan-1/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây\nBài dịch phần 2\nBạn có cảm thấy lạ khi thực hiện MVC trong iOS? Bạn có những nghi ngờ về việc chuyển sang MVVM? Bạn có nghe nói về VIPER, nhưng không chắc rằng nó có …","title":"Mô hình kiến trúc iOS (phần 1)"},{"content":"ℹ️ Bài này được mình dịch từ đây. Động lực cá nhân Tôi thường xuyên nhận được nhiều email và message.\n\u0026amp;ldquo;Bob, làm thế nào để trở thành developer bá đạo?\u0026amp;rdquo;\n\u0026amp;ldquo;Bob, Tôi muốn thay đổi sự nghiệp. Tôi thích những bài viết và video của bạn. Làm thế nào để trở thành iOS developer?\u0026amp;rdquo;\n\u0026amp;ldquo;Bob, Tôi không biết bắt đầu như thế nào. Tôi chưa từng lập trình trước đó. Bạn có thể giúp tôi không?\u0026amp;rdquo;\nTôi hiểu, nhưng tôi không nói dối. Tôi không thể trả lời những câu hỏi chung chung như thế. Tôi gọi nó là những câu hỏi thời tiết. Nó vô nghĩa. Nó cho thấy sự thiếu chuẩn bị.\nNếu họ là bạn thân của tôi, có lẽ tôi sẽ bắt bẻ lại,\n✅ \u0026amp;ldquo;Mày đã google chưa? Nếu rồi thì tìm thêm đi.\u0026amp;rdquo; Tuy nhiên, tôi có thể chia sẽ những hiểu biết giới hạn của mình thông qua bài viết này. Thứ hai là khi một ai đó hỏi câu tương tự, tôi sẽ nói, \u0026amp;ldquo;Xin hãy đọc bài viết này trước và sau đó hãy hỏi\u0026amp;rdquo;.\nKhông chịu trách nhiệm: Bài viết này chỉ là góc nhìn riêng của tôi, có thể tôi thiên vị. Tôi …","date":"2017-02-20","href":"/vi/posts/0006lamthenaodetrothanhiosdeveloper/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây. Động lực cá nhân Tôi thường xuyên nhận được nhiều email và message.\n","title":"Làm thế nào để trở thành iOS developer?"},{"content":"ℹ️ Bài này được mình dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nArray vs. Optional Ở phần trước, chúng ta đã học được function map() và flatmap() trên Array\u0026amp;lt;T\u0026amp;gt;:\n// Method on Array\u0026amp;lt;T\u0026amp;gt; map( transform: T -\u0026amp;gt; U ) -\u0026amp;gt; Array\u0026amp;lt;U\u0026amp;gt; flatMap( transform: T -\u0026amp;gt; Array\u0026amp;lt;U\u0026amp;gt; ) -\u0026amp;gt; Array\u0026amp;lt;U\u0026amp;gt; Điều này có nghĩa là, cho 1 biến đổi T-\u0026amp;gt;U bạn có thể biến đổi 1 mảng của T thành 1 mảng của U. Đơn giản chỉ cần gọi map(transform: T-\u0026amp;gt;U) trên Array\u0026amp;lt;T\u0026amp;gt; và nó sẽ trả về một Array\u0026amp;lt;U\u0026amp;gt;\nfunction map() và flatmap() trên Optional\u0026amp;lt;T\u0026amp;gt; cũng hoạt động tương tự:\n// Method on Optional\u0026amp;lt;T\u0026amp;gt; map( transform: T -\u0026amp;gt; U ) -\u0026amp;gt; Optional\u0026amp;lt;U\u0026amp;gt; flatMap( transform: T -\u0026amp;gt; Optional\u0026amp;lt;U\u0026amp;gt; ) -\u0026amp;gt; Optional\u0026amp;lt;U\u0026amp;gt; map() on Optionals map method sẽ làm gì ở kiểu Optional\u0026amp;lt;T\u0026amp;gt; (còn gọi là T?)?\nNó sẽ xử lý tương tự như ở Array\u0026amp;lt;T\u0026amp;gt;, nó lấy nội dung của …","date":"2017-02-16","href":"/vi/posts/0005tuduytrongngonnguswiftp4/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nArray vs. Optional Ở phần …","title":"Tư duy trong ngôn ngữ Swift, Phần 4: map all the things!"},{"content":"ℹ️ Bài này được mình dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nNhắc lại phần trước Trong phần 2, chúng ta đã biết cách sử dụng map và flatMap trên array để tránh các biến trung gian khi biến đổi và thay vào đó chúng ta đã sử dụng functional programming. [1]\nĐây là code ở cuối của phần 2:\nclass ListItem { var icon: UIImage? var title: String = \u0026amp;#34;\u0026amp;#34; var url: NSURL! static func listItemsFromJSONData(jsonData: NSData?) -\u0026amp;gt; [ListItem] { guard let nonNilJsonData = jsonData, let json = try? NSJSONSerialization.JSONObjectWithData(nonNilJsonData, options: []), let jsonItems = json as? Array\u0026amp;lt;NSDictionary\u0026amp;gt; else { return [] } return jsonItems.flatMap { (itemDesc: NSDictionary) -\u0026amp;gt; ListItem? in guard let title = itemDesc[\u0026amp;#34;title\u0026amp;#34;] as? String, let urlString = itemDesc[\u0026amp;#34;url\u0026amp;#34;] as? String, let url = NSURL(string: urlString) else { return nil } let li = ListItem() …","date":"2017-02-12","href":"/vi/posts/0004tuduytrongngonnguswiftp3/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nNhắc lại phần trước Trong …","title":"Tư duy trong ngôn ngữ Swift, Phần 3: Struct vs. Class"},{"content":"ℹ️ Bài này được mình dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nTrong phần 1, ta đã biết cách làm thế nào để tránh force-unwrapping optionals, để giải cứu ponies 🐴 và tránh code bị crash. Trong phần 2 này, ta sẽ chỉnh sửa code để làm nó trở nên Swift-er hơn thông qua map() và flatMap().\nPhần 2 này sẽ nói về map và flatMap trên Arays\nNhắc lại, tư duy trong Swift Đây là code khi kết thúc phần 1\nclass ListItem { var icon: UIImage? var title: String = \u0026amp;#34;\u0026amp;#34; var url: NSURL! static func listItemsFromJSONData(jsonData: NSData?) -\u0026amp;gt; [ListItem] { guard let nonNilJsonData = jsonData, let json = try? NSJSONSerialization.JSONObjectWithData(nonNilJsonData, options: []), let jsonItems = json as? Array\u0026amp;lt;NSDictionary\u0026amp;gt; else { // If we failed to unserialize the JSON or that JSON wasn\u0026amp;#39;t an NSArray, // then bail early with an empty array return [] } var items = [ListItem]() for …","date":"2017-02-08","href":"/vi/posts/0003tuduytrongngonnguswiftp2/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nTrong phần 1, ta đã biết …","title":"Tư duy trong ngôn ngữ Swift, Phần 2: map those arrays"},{"content":"ℹ️ Bài này được dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nĐừng bao giờ giết một pony ? Trong bài viết lần trước, tôi kêu gọi các bạn không sử dụng !. Một số bạn có thể đã hiểu theo kiểu tiêu cực như là \u0026amp;ldquo;không bao giờ sử dụng nó, đừng bao giờ\u0026amp;rdquo;. Những gì tôi nói là trong thực tế \u0026amp;ldquo;mỗi khi bạn thêm một ! chỉ vì trình biên dịch gợi ý, bạn đang giết chết một pony 🐴 \u0026amp;ldquo;. Nhưng chắc chắn rằng 🐴 có thể tiếp tục sống nếu bạn thực sự biết những gì bạn đang làm. Đừng làm điều đó chỉ vì trình biên dịch đề nghị, hãy suy nghĩ thật kỹ.\nTrong một số trường hợp, sử dụng implicitly-unwrapped optionals vẫn có ích. Nhưng chỉ khi nào bạn nghĩ kỹ về nó, bạn biết rõ lý do tại sao bạn sử dụng nó và nó sẽ an toàn.\nKhi nào thì từ bỏ ponies? Dưới đây là một vài trường hợp mà bạn sử dụng ! sẽ an toàn trong Swift. Có lẽ, không chỉ các trường hợp dưới đây sử dụng ! mà còn nhiều trường …","date":"2017-02-06","href":"/vi/posts/0002tuduytrongngonnguswiftp1bs/","section":"posts","summary":"ℹ️ Bài này được dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nĐừng bao giờ giết một pony ? …","title":"Tư duy trong ngôn ngữ Swift, Phần 1 bổ sung: Từ bỏ ponies"},{"content":"ℹ️ Bài này được mình dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nTôi thấy rằng, những-người-mới-tìm-hiểu về Swift thường hay cố chuyển đổi code của họ từ ObjC sang Swift. Nhưng phần khó nhất để code trong Swift không phải là về cú pháp mà là cách bạn tư duy trong Swift, sử dụng những khái niệm mới trong Swift mà không có trong ObjC.\nTrong series bài này, tôi sẽ lấy một ví dụ về code ObjC rồi chuyển đổi sang Swift và giới thiệu nhiều khái niệm của Swift trong quá trình chuyển đổi.\nPhần 1 nói về: optionals, forced-unwrapped optionals, ponies, if let, guard, và 🍰.\nObjC code Bạn muốn tạo ra danh sách các item (để hiển thị trong TableView chẳng hạn) - mỗi item có icon, title và url - nó được khởi tạo từ JSON. Đây là code ObjC:\n@interface ListItem : NSObject @property(strong) UIImage* icon; @property(strong) NSString* title; @property(strong) NSURL* url; @end @implementation ListItem …","date":"2017-02-01","href":"/vi/posts/0001tuduytrongngonnguswiftp1/","section":"posts","summary":"ℹ️ Bài này được mình dịch từ đây: alisoftware.github.io\nBài này là 1 phần của series. Bạn có thể đọc các phần còn lại ở đây: phần 1, phần 1 bổ sung, phần 2, phần 3, phần 4\nTôi thấy rằng, …","title":"Tư duy trong ngôn ngữ Swift, Phần 1: Giải cứu ponies"}]