Lấy url từ string

Từ một lời thắc mắc Bạn đã bao giờ tự hỏi làm thế nào để lấy ra url từ string ko? Cách đơn giản hướng đến đầu tiên là split string ra rồi đưa vào hàm URL.init 1 2 3 4 5 var str = "goto https://www.google.com/" let urls = str.components(separatedBy: .whitespaces) .compactMap(URL.init) // [goto, https://www.google.com/] Kết quả ra cả “goto”, có gì đó sai sai? Hóa ra thằng URL.

Ẩn Keyboard

Xin chào mọi người, hôm nay mình sẽ trở lại với một vấn đề quen thuộc. Đó là ẩn keyboard, xử lý tuy rằng đơn giản, nhưng để làm “mượt” thì cũng không dễ tẹo nào. Mình sẽ đi từng bước một, từ cách bình dân nhất, rồi đến những xử lý refactor. Cách bình dân Cách chúng ta thường thấy nhất là: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class ViewController: UIViewController { @IBOutlet weak var txtField: UITextField!

Sugar Syntax

Swift có một số phương pháp để code viết gọn hơn, hay còn gọi là sugar syntax. Hôm nay mình sẽ giới thiệu một số phương pháp. Các cách này có thể không mang nhiều tính áp dụng, tuy nhiên sẽ giúp chúng ta hiểu sâu hơn về ngôn ngữ mình đang sử dụng dynamicallyCallable Áp dụng cấu trúc này cho class, struct, enum hoặc protocol. Sử dụng code ví dụ để dễ hình dung

Collection view layout

CollectionView hoạt động như nào UICollectionView là subclass của UIScrollView. Nói một cách khác, nó là UIView nhưng có thêm chức năng thay đổi bounds. Khi chúng ta di chuyển cell, chúng ta thay đổi giá trị contentOffset, đồng thời thay đổi không gian hiển thị của UICollectionView. Trăm nghe không bằng một thấy, tốt nhất là trình diễn bằng hình ảnh cho dễ hiểu. Trên là hình ảnh mắt chúng ta nhìn thấy khi di chuyển collection view (ô chữ nhật xanh lá cây tượng trưng cho màn hình điện thoại).

Vài tip 03.06.19

Một số phương thức hỗ trợ lập trình, note lại cho bản thân. Autolayout 1 2 3 4 5 6 7 8 9 10 11 12 extension UIView { func pinToBounds(_ view: UIView) { view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ view.topAnchor.constraint(equalTo: topAnchor), view.bottomAnchor.constraint(equalTo: bottomAnchor), view.leadingAnchor.constraint(equalTo: leadingAnchor), view.trailingAnchor.constraint(equalTo: trailingAnchor) ]) } } Storyboard 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 protocol Storyboardable { } extension Storyboardable where Self: UIViewController { static func instantiateInitialFromStoryboard() -> Self { let controller = storyboard().