Làm thế nào để tạo lớp nhanh cho danh mục?


84

Tôi muốn tạo danh mục của lớp nhanh hiện có của mình, nhưng không có tùy chọn nào trong IDE để làm như vậy.

Bất kỳ ý tưởng nếu danh mục tồn tại trong dự án nhanh chóng? Hoặc làm thế nào để đạt được chức năng tương tự trong dự án nhanh?


2
nó đã gọi extension.
holex

Câu trả lời:


128

Trong Swift, bạn có thể sử dụng Extensionsđể thêm chức năng mới vào các lớp, cấu trúc và kiểu liệt kê hiện có.

Chúng khác với danh mục Objective-C ở một số điểm, chủ yếu là:

  • Họ không có tên
  • Bạn không cần nhập Tiện ích mở rộng một cách rõ ràng. Nếu bạn xác định tiện ích mở rộng để thêm chức năng mới vào một loại hiện có, chức năng mới sẽ có sẵn trên tất cả các phiên bản hiện có của loại đó, ngay cả khi chúng được tạo trước khi tiện ích mở rộng được xác định.
  • Như đã nêu ở trên, chúng không chỉ hoạt động với các lớp mà còn với các loại khác.

Như ngày nay, Tiện ích mở rộng có thể:

  • Thêm thuộc tính được tính toán và thuộc tính tĩnh được tính toán
  • Xác định phương thức phiên bản và phương thức kiểu
  • Cung cấp trình khởi tạo mới
  • Xác định chỉ số phụ
  • Xác định và sử dụng các kiểu lồng nhau mới
  • Làm cho một loại hiện có tuân theo một giao thức

Cú pháp cơ bản để khai báo một phần mở rộng như sau:

extension SomeType {
    // new functionality to add to SomeType goes here
}

Kiểm tra tài liệu của Apple để biết thêm thông tin về cách sử dụng Tiện ích mở rộng trong Swift.


99

Trong Objective C, chúng được gọi là danh mục , nhưng trong Swift chúng được gọi là phần mở rộng . Mục đích của cả hai là cung cấp chức năng bổ sung cho các lớp hiện có mà không cần phải tạo các lớp con.

Tôi đã đọc về các tiện ích mở rộng trong tài liệu, nhưng tôi không thực sự hiểu cách sử dụng một tiện ích mở rộng trong dự án của mình cho đến khi tôi xem video hướng dẫn này ( phiên bản YouTube , nguồn github ).

Đây là một bản tóm tắt được trích từ video về cách thực hiện.

Thêm tệp Swift vào dự án của bạn

  • Nhấp chuột phải vào Project Navigator và chọn "New File ..."

  • Chọn "Tệp Swift"

  • Quy ước là lưu tên tệp dưới dạng tên lớp bạn đang mở rộng cộng (với dấu "+") những gì bạn đang làm với nó. Ví dụ: "UIImage + Cropping".

Viết mã cho phần mở rộng

Mở tệp Swift mới mà bạn vừa tạo.

Bạn nên nhập UIKit(thay vì Foundation) nếu bạn đang mở rộng a UIView. Sau đó sử dụng extensiontừ khóa trước tên lớp mà bạn muốn mở rộng. Sau đó, bạn có thể thêm các phương thức mới của riêng mình vào lớp. (Lưu ý, phần mở rộng là để thêm các phương thức mới, không ghi đè các phương thức hiện có - do đó có tên.)

Trong video, ví dụ là thêm một phương pháp cắt một vòng tròn từ hình ảnh và tạo đường viền cho nó.

import UIKit

extension UIImage {
    
    func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
        
        // code to create the cropped circle with colored border
        
        return newImage
    }
}

Xem ví dụ đầy đủ ở đây .

Sử dụng tiện ích mở rộng của bạn ở bất kỳ đâu trong dự án của bạn

Bây giờ bạn có thể sử dụng phương thức mới của mình cho lớp đó ở bất kỳ đâu trong mã của bạn, giống như nó là một phần của lớp chuẩn.

Đây là ví dụ của video ( trên github ):

import UIKit
class ViewController: UIViewController {
                            
    @IBOutlet var imageView : UIImageView = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let img = imageView.image
        imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
    }
}

Phương pháp cropToCircleWithBorderColornày không phải là một phần tiêu chuẩn của nó UIImage, nhưng như bạn có thể thấy, nó được sử dụng giống như trước đây.

Để nghiên cứu thêm:


8

Trong Swift, nó được gọi là Phần mở rộng ! Kiểm tra nó ra


Nhưng extensionkhông thể bao gồm các biến, điều đó làm cho mọi thứ hoàn toàn khác.
RnMss,

Ngay cả trong các danh mục Objective-C cũng không thể có biến (không có hack).
Valentin Shergin

ObjC đối tượng liên quan là không hacks
malhal

0

Bạn có thể sử dụng mã sau trong lớp hiện có của mình

extension name{
func funcName(){
   } 
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.