2014-09-17 13 views
6

Ví dụ tôi có phương pháp này trong nhanh chóng:Làm thế nào để gọi hàm Swift với nhiều hơn một tham số từ lớp C mục tiêu?

@objc class MyClass: NSObject 
.... 
@objc class func viewWithIndex(index: Int, str: String) { 
    println(index, str) 
} 

sau đó tôi muốn gọi là phương pháp trong lớp Mục tiêu-c của tôi, và tôi đã mong đơn giản như cuộc gọi này [MyClass viewWithIndex:10 str:@"string"]; nhưng nó không hoạt động.

Tôi gọi nó như thế nào? Hãy giúp tôi.

Lưu ý: Tôi đã thực hiện cuộc gọi chức năng nhanh đến mục tiêu [MyClass showSomething]; để có nghĩa là tôi đã thiết lập thành công các cài đặt cần thiết cho các lớp cầu nối. Chỉ có chức năng có hai tham số nữa là vấn đề của tôi. :)

quyết:

Tôi không biết những gì tôi đã xảy ra nhưng tôi chỉ cần khởi động lại mac của tôi và lấy ra objc và nó làm việc với các cuộc gọi [MyClass viewWithIndex:10 str:@"string"];. Tôi nhớ đọc trong tài liệu.

Migrating Your Objective-C Code to Swift

  • Để có thể truy cập và sử dụng được trong Objective-C, một lớp Swift phải là hậu duệ của một lớp Objective-C hoặc nó phải được đánh dấu @objc.
+0

Điều gì không hiệu quả? Bạn có lỗi biên dịch hay lỗi thời gian chạy? – Francescu

+0

Lớp Swift của bạn có phải là lớp con của NSObject không? So sánh http://stackoverflow.com/questions/25605677/productmodulename-swift-h-not-exporting-all-swift-classes. –

+0

Tôi có một cuộc gọi hàm nhanh làm việc với lớp khách quan-c nhưng không có tham số hoặc chỉ một tham số. bây giờ tôi muốn thử hai hoặc nhiều tham số. lỗi mà nó tạo ra là 'Không có phương thức lớp đã biết cho chế độ xem selectorWithIndex: str' –

Trả lời

2

Tôi tin rằng bạn sẽ cần phải đánh dấu chức năng là công khai (có ý nghĩa) hoặc động. Nếu không, nó sẽ là một ứng cử viên cho tối ưu hóa của Swift (inline hoặc vtable method) mà sẽ làm cho nó vô hình với Objective-C.

Hãy thử điều này:

public class func viewWithIndex(index: Int, str: String) { 
    println(index, str) 
} 

Hoặc này: (không thực sự có ý nghĩa, nhưng cũng nên làm việc)

private dynamic class func viewWithIndex(index: Int, str: String) { 
    println(index, str) 
} 
+0

tôi không biết chuyện gì đã xảy ra nhưng khi tôi bật mac của tôi sáng nay và loại bỏ '@ objc' nó chỉ hoạt động đúng với cuộc gọi' [MyClass viewWithIndex: 10 str: @ "string"]; ' –

+0

OK, nó phải là phương pháp đã được sử dụng công văn động. Khi không, tôi đã tìm thấy cách tiếp cận trên hoạt động. .các quy tắc tương tự cho hướng dẫn làm việc với KVO trong Swift nên áp dụng. –

+0

tôi đoán tôi không cần 'public' hoặc' dynamic' hoặc etc coz i có lớp con của tôi để 'NSObject'. –

9

này đã làm việc cho tôi trong Swift 3.0

public class func viewWithIndex(_ index: Int, str: String) { 
    println(index, str) 
} 

Thêm bạn nderscore trước tham số đầu tiên trong khai báo Swift cho phép tôi gọi từ mục tiêu c mà không đặt tên tham số đầu tiên, như sau:

[MyClass viewWithIndex:10 str:@"string"] 
+0

Điều này chắc chắn đã tiết kiệm rất nhiều thời gian. Cảm ơn –

+0

Dấu gạch dưới ở đầu danh sách tham số của phương thức thực sự là gì? '..viewWithIndex (_ index..'. Tôi có thể xác nhận điều này cũng có tác dụng với tôi, nhưng những gì đang xảy ra ở đây? Mã thông báo này có tên trong ngữ cảnh này không? –

+1

@JamesTSnell _ xác định có hay không tên tham số được sử dụng khi gọi phương thức.Trong ví dụ trên, thậm chí gọi phương thức đó từ nhanh sẽ trông giống như sau: 'className.viewWithIndex (10, str:" test ")' .Nếu định nghĩa phương thức có _ trước cả chỉ mục và str , sau đó gọi phương thức sẽ giống như sau: 'className.viewWithIndex (10," test ")' – haplo1384

Các vấn đề liên quan