2014-07-02 23 views
6

Tôi đang cố gắng sinh ra một luồng nhanh chóng. Vì vậy, tôi có dòng này:Tạo chủ đề nhanh chóng?

. . .

let thread = NSThread(target: self, selector: doSomething(), object: nil) 

. . .

doMột cái gì đó là một hàm nằm trong phạm vi của lớp.

dòng đó cho lỗi này: "không thể tìm thấy một tình trạng quá tải cho init() chấp nhận các đối số cung cấp"

tôi đang thiếu gì ở đây? Tôi có thể tạo một chủ đề mới nhanh chóng không?

Trả lời

12

Tính đến Xcode 7.3 và Swift 2.2, bạn có thể sử dụng hình thức đặc biệt #selector(...) nơi Objective-C sẽ sử dụng @selector(...):

let thread = NSThread(target:self, selector:#selector(doSomething), object:nil) 
+0

Làm thế nào bạn sẽ làm điều đó nếu 'doSomething' cần một cuộc tranh cãi (nói kiểu 'NSString')? – Matt

+0

Đó là những gì đối số 'đối tượng' dành cho. –

+0

Tôi đã thử điều đó, nhưng tôi tiếp tục nhận được một 'NSInvalidArgumentException':' [NSThread initWithTarget: selector: object:]: target không thực hiện selector'. Nó dường như không nhận ra tên hàm của tôi. (Tôi có nên đăng câu hỏi này dưới dạng câu hỏi mới không?) – Matt

4

NSThread mất một chọn vì nó là tham số thứ hai. Bạn có thể mô tả các bộ chọn Objective-C như các chuỗi trong Swift như sau:

let thread = NSThread(target: myObj, selector: "mySelector", object: nil) 

Các hàm Swift không phải là phương pháp tương đương với mục tiêu-c. Nếu bạn có một phương pháp trong một lớp học nhanh chóng, bạn có thể sử dụng nó như một chọn nếu bạn sử dụng thuộc tính @objc trên lớp:

@objc class myClass{ 
    func myFunc(){ 
    } 
} 

var myObj = myClass() 
let thread = NSThread(target: myObj, selector: "myFunc", object: nil) 
0
  1. Khi chúng ta gọi là một chọn vào một mục tiêu, chúng ta nên kiểm tra nếu mục tiêu tồn tại và nó đáp ứng với bộ chọn. Chỉ lớp học mở rộng từ NSObject hoặc các lớp con của nó có thể sử dụng respondsToSelector:

  2. Bạn có thể sử dụng NSDictionary để lưu trữ thông số nếu bạn có nhiều hơn 2 tham số.

    Ex:

    //this code is in Objective-C but the same code should exist in Swift 
    
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:object1, @"key1", object2, @"key2",nil]; 
    

sau đó vượt qua 'params' để tham số của selector:

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