Swift学习笔记

一、

    在Objective-C的

1
[self performSelector:@selector(updateStatus)   onThread:[NSThread mainThread] withObject:nil waitUntilDone:NO];

在Swift中是没有performSelector方法的。替代方法有2种

1、设置Timer定时器

1
NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("updateStatus"), userInfo: nil, repeats: false)

2、利用GCD定时器

1
2
3
dispatch_after(1, dispatch_get_main_queue(), {
// your function here
})

二、

1
text.boundingRectWithSize(CGSizeMake(w, CGFloat.max), options: NSStringDrawingOptions.TruncatesLastVisibleLine | NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading, attributes: attribute, context: nil)

    这段正常的代码在iOS8.1、Xcode6.1下会报错。搜了一下发现这个。意思是说当吧target设为OS X 10.10时,就正常。如果设为iOS8 SDK,就会警告异常。NSStringDrawingOptions被Swift作为enum:Int类型,而不是struct:RawOptionSet,这是Apple的bug。PS:我第一次向Apple报告iOS SDK的bug。

    同时,这里给出了一个解决方法。就是在Objective-C中写好多个option的连接方法,然后在Swift中调用该方法。

1
2
3
4
+ (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2
{
return option1 | option2;
}

1
let boundingRect = "string".boundingRectWithSize(size, options: StringDrawingOptions.combine(.UsesLineFragmentOrigin, with: .UsesFontLeading), attributes:nil, context:nil)