我试图在swift中生成一个线程。 所以我有这句话:
。 。
let thread = NSThread(target: self, selector: doSomething(), object: nil)
。 。
doSomething是该类范围内的一个函数。
该行给出了此错误: "找不到接受提供的参数"
的init()的重载我在这里缺少什么?我可以在swift中创建一个新线程吗?
答案 0 :(得分:13)
从Xcode 7.3和Swift 2.2开始,您可以使用Objective-C将使用#selector(...)
的特殊形式@selector(...)
:
let thread = NSThread(target:self, selector:#selector(doSomething), object:nil)
答案 1 :(得分:4)
NSThread将选择器作为其第二个参数。你可以在Swift中将Objective-C选择器描述为字符串,如下所示:
let thread = NSThread(target: myObj, selector: "mySelector", object: nil)
Swift函数不是等效的objective-c方法。如果在swift类中有一个方法,如果在类上使用@objc属性,则可以将它用作选择器:
@objc class myClass{
func myFunc(){
}
}
var myObj = myClass()
let thread = NSThread(target: myObj, selector: "myFunc", object: nil)
答案 2 :(得分:0)
当我们在目标上调用选择器时,我们应该检查目标是否存在并且它响应选择器。只有从NSObject
或其子类扩展的类才能使用respondsToSelector:
如果您有超过2个参数,则可以使用NSDictionary
存储参数。
前:
//this code is in Objective-C but the same code should exist in Swift
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:object1, @"key1", object2, @"key2",nil];
然后将'params'传递给选择器的参数: