Tôi đã tìm kiếm một số bài đăng, tôi nghĩ rằng tôi không thể viết tiện ích mở rộng nhanh chóng và gọi nó từ mã Objective-C, phải không?
@objc như các thuộc tính chỉ hỗ trợ phương thức, lớp, giao thức?
Tôi đã tìm kiếm một số bài đăng, tôi nghĩ rằng tôi không thể viết tiện ích mở rộng nhanh chóng và gọi nó từ mã Objective-C, phải không?
@objc như các thuộc tính chỉ hỗ trợ phương thức, lớp, giao thức?
Câu trả lời:
Bạn có thể viết một phần mở rộng Swift và sử dụng nó trong mã Objective-C. Đã kiểm tra với XCode 6.1.1.
Tất cả những gì bạn cần làm là:
tạo tiện ích mở rộng của bạn bằng Swift (không có @objc
chú thích)
#import "ProjectTarget-Swift.h"
trong lớp Objective-C của bạn (trong đó "ProjectTarget" đại diện cho mục tiêu XCode mà tiện ích mở rộng Swift được liên kết với)
gọi các phương thức từ phần mở rộng Swift
Cập nhật:
Kể từ khi @Rizwan Ahmed được đề cập, bạn cần thêm @objc
chú thích:
Kể từ Swift 4.0.3, chú thích @objc là cần thiết nếu bạn muốn sử dụng tiện ích mở rộng trong các tệp lớp Objective C.
Tôi phát hiện ra rằng trong Swift 4.0, tôi phải thêm @objc
vào trước từ khóa tiện ích mở rộng của mình để các phương thức mở rộng Swift hiển thị bởi một phiên bản của lớp objc mà tôi đang mở rộng.
Nói ngắn gọn:
Thiết lập cấu hình tệp:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
Trong CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
Trong AppDelegate.m của tôi:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
chú thích.
Giải pháp này hoạt động cho Swift 2.2 và Swift 3 . Lưu ý rằng chỉ các phần mở rộng cho các lớp (không phải cho cấu trúc hoặc enum) mới có thể truy cập được từ Objective-C.
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Sau đó, #import "ProductModuleName-Swift.h" trong tệp ObjC của bạn.
Swift 4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
public
là cần thiết? Hoạt động tốt mà không cần public
sửa đổi cho tôi. Chúng ta có giả định rằng phần mở rộng không nằm trong cùng một dự án mà được nhập từ một dự án khác không?
Như đã đề cập trong các câu trả lời khác, việc nhập tiêu đề Swift đã tạo hoạt động trong hầu hết các trường hợp .
Một ngoại lệ cho điều này là khi danh mục được xác định trên một kiểu bắc cầu (nghĩa là phần mở rộng được xác định trên String
và không NSString
). Các danh mục này sẽ không tự động được bắc cầu với các đối tác Objective-C của chúng. Để giải quyết vấn đề này, bạn sẽ cần sử dụng kiểu Objective-C (và truyền giá trị trả về trong mã Swift của bạn với as String
) hoặc xác định phần mở rộng cho cả kiểu Swift và Objective-C.
public extension NSString
. Bạn sẽ nhận được một định danh chưa được giải quyết hoặc báo lỗi tương tự tại thời gian biên dịch, bạn có thể cast một lần nữa trở lại với chuỗi ví dụ let sVal = self as String
và sau đó gọi mã cần thiết trênsVal
mclaughlinj
đã nói, cho cả lớp NSString và String struct