2015年12月

swift后台进程

class IPhoneMainView:NSObject {
    var lock = NSLock()
    var imageDB = [String]()
    var workerForImage:NSThread?
    func show()
    {
        //启动一个进程
        workerForImage = NSThread(target: self, selector: "run", object: nil)
        workerForImage!.name = "负责在后台下载图片"
        workerForImage!.start()
    }
    func hide()
    {
        workerForImage!.cancel()
    }
    func run()
    {
        while(true)
        {
            imageDB.append("第\(imageDB.count+1)张")
            print("下好了第\(imageDB.count+1)张")
            NSThread.sleepForTimeInterval(0.1)
            if NSThread.currentThread().cancelled
            {
                NSThread.exit()
                print("收到线程结束请求,顺利结束进程")
            }
        }
    }
}
var iphoneView = IPhoneMainView()
iphoneView.show()
while(true)
{
    var date = NSDate()
    NSRunLoop.currentRunLoop().runUntilDate(date.dateByAddingTimeInterval(50))
    break
}
iphoneView.hide()

swift定时器

import Foundation

//定义消息泵
class OCMessagePump: NSObject {
    var timer:NSTimer?
    var count = 0

    func start()
    {
        //初始化
        timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "timerFireMethod", userInfo: nil, repeats: true)
        timer?.fire()
    }
    func stop()
    {
        timer!.invalidate()
    }
    func timerFireMethod()
    {
        print("接受消息定时派发命令,处理控件消息: OCButtonClicked 消息")
        //向通知中心推送消息,注意这里是异步的,且消息标示是:MessageReceiver
        NSNotificationCenter.defaultCenter().postNotificationName("OCButtonClicked", object: nil)
        //派发十条停止定时器
        if count++ > 10
        {
            self.stop()
        }
    }
}
class OCButton: OCMessagePump {
    override init()
    {
        super.init()
        //向通知中心注册自己的消息处理函数
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "ButtonClicked:", name: "OCButtonClicked", object: nil)

    }
    func ButtonClicked(notify:NSNotification)
    {
        print("收到消息泵通知,当前按钮被单机")
    }
}
//初始化消息接受者
var button = OCButton()
//初始化消息泵
var ocMessagePump = OCMessagePump()
//启动消息泵
ocMessagePump.start()
//延时当前主循环
while (true)
{
    var date = NSDate()
    NSRunLoop.currentRunLoop().runUntilDate(date.dateByAddingTimeInterval(100))
    break
}

会输出十次

接受消息定时派发命令,处理控件消息: OCButtonClicked 消息
收到消息泵通知,当前按钮被单机

在学习的书上的例子,记录下,说不定之后有用,看不懂英文太伤了

关于闭包的疑惑

昨天按照书上例子,按照格式写闭包,但是会报错 在这篇文章可以看到具体 has no title attribute.
今天看类这个文章 http://my.oschina.net/lanrenbar/blog/467768
原来还能用闭包来给变量赋值,这里会报错应该是不值得变量的具体类型,

var sortB = {i1,i2 in return i1 > i2}//这里会报错,因为不值得变量到底是一个闭包函数还是只是存储闭包函数返回值的变量

func sortF(sort:(Int,Int)->Bool)
{
    print("aaaa")
}
sortF({i1,i2 in return i1 > i2})//这里不会报错,因为在sortF函数中已经指定了类型

var sortC:(Int,Int)->Bool = {i1,i2 in return i1 > i2}//这里不会报错,因为变量已经指定了类型

在用变量存储闭包函数的时候,如果要简写,要写好类型

swift闭包

记录下学习swift的过程
正常闭包格式
{(参数列表) -> 返回值 in

}
如例

var sort = {(i1:Int,i2:Int)->Bool in return i1 > i2}

简化
按照案例,简化成这样

var sort = {i1,i2 in return i1 > i2}

会报错

/Users/admin/xcode/HelloYoungCoder/HelloYoungCoder/AppDelegate.swift:236:40: Ambiguous use of operator '>'

可能是因为swift版本的原因吧

疑惑的到解答 ,之前有问题的地方是用的方式不对

1,简化掉参数类型,swift支持类型推导,所以可以简化掉闭包函数参数的类型

var sortB:(Int,Int)->Bool = {i1,i2 in return i1 > i2}

2,简化掉return,因为函数主题只有一行,所以可以省略掉return

var sortC:(Int,Int)->Bool = {i1,i2 in i1 > i2}

3,简化参数名称,swift为闭包函数提供了名称缩写功能,所简化掉参数名称

var sortD:(Int,Int)->Bool = {$0 > $1}

4,利用运算符函数简化,

var sortG:(Int,Int)->Bool = (>)

类中有常量,并定义可失败构造器,报错

class TeachSchool
{
    var name : String?
    var location : String?
    var topField : String?
    let advertisement : String? //把这个常量改成变量,就好了

    //指定构造器
    init(name : String,location : String,topField : String,advertisement : String)
    {
        self.name = name
        self.location = location
        self.topField = topField
        self.advertisement = advertisement
    }
    //便捷构造器
    convenience init()
    {
        self.init(name : "蓝翔",location : "山东",topField : "挖掘机",advertisement : "挖掘机哪家强,中国山东找蓝翔")
    }
    //可失败构造器
    init? (has3IDCard : Bool)
    {
        return nil ///会报告这个错误 All stored properties of a class instance must be initialized before returning nil from an initializer
    }
    //可失败构造器
    convenience init! (isRumor : Bool)
    {
        self.init(name : "蓝翔",location : "山东",topField : "挖掘机",advertisement : "挖掘机哪家强,中国山东找蓝翔")
    }
}

最近在学习swift,看的一本书上的例子,会报错,不知道是不是版本的原因,当类的属性有常量的时候,定义可失败构造器会报错 All stored properties of a class instance must be initialized before returning nil from an initializer
这样的话,如果类的属性需要这种特性,该怎么实现呢?哪位大神知道,求告知