2015-09-16 09:20:19 sinat_28432741 阅读数 681
swift利用NSKeyedArchiver归档

Swift实现对象归档时有几个注意点

  • 要继承 NSCoding,实现两个方法

  • extension 是一个分类,分类不允许有存储能力,所以协议方法不能写在分类中

  • 协议中的init(coder decoder: NSCoder)函数会覆盖原始的构造函数,所以类中至少还要有另一个init方法

  • 如果不指定键名,会使用属性名称作为 key,基本数据类型,需要指定 key

class <#className#>: NSObject,NSCoding {
// 至少要有一个 init 方法,否则外部没有办法直接实例化对象
override init() {
}
// 归档方法
func encodeWithCoder(encoder: NSCoder) {
       // TODO   
}   
// 解档方法,会覆盖构造函数   
required init(coder decoder: NSCoder) {      
  // TODO   
}
}

//为什么会出现报错呢?
//init(coder decoder:NSCoder){}中解档没有写完.
import UIKit

class CellData: NSObject {
  
    //cell的标题
    var text:String = ""
    //cell的勾选属性
    var isChecked:Bool

    //构造方法
     init(text:String,isChecked:Bool){
        self.text = text
        self.isChecked = isChecked
    }
    //勾选属性取反方法
    func chengedChecked(){
        self.isChecked = !isChecked
    }
    //编码成OBject
    func encodeWithCoder(aCoder:NSCoder!){
        aCoder.encodeObject(text,forKey:"text")
        aCoder.encodeObject(isChecked,forKey:"isChecked")
    }
    //NSObject解析回来
    required init(coder aDecoder:NSCoder!){
        self.text = aDecoder.decodeObjectForKey("text") as String
        self.isChecked = aDecoder.decodeObjectForKey("isChecked") as Bool
    }
}
——————————————存---------------------------
    //将数据保存到沙盒的方法
    func saveCheckListData(){
   
       
var data = NSMutableData()//创建一个可变的二进制数据
        //声明一个归档处理对象
        var archiver = NSKeyedArchiver(forWritingWithMutableData: data)
       
       
//arrayData按对应的CheckListData关键字进行编码
        archiver.encodeObject(arrayData, forKey: "CheckListData")
       
       
//结束编码
        archiver.finishEncoding()
       
//数据写入
        data.writeToFile(dataFilePath(), atomically: true)
    }
——————————————读--------------------
    //从沙盒中读取数据
    func loadCheckListData(){
   
       
//1.获取本地数据文件路径
        let path = self.dataFilePath()
       
//2.创建文件管理器
        let manager = NSFileManager()
       
//3.判断文件路径是否存在
        if manager.fileExistsAtPath(path){//存在
            //4.读取文件
            let data = NSData(contentsOfFile: path)
           
//5.创建解码器
            let unArchiver = NSKeyedUnarchiver(forReadingWithData: data!)
           
//6.通过归档时设置的关键字CheckListData来还原arrayData
            arrayData = unArchiver.decodeObjectForKey("CheckListData") as Array
           
//7.关闭解码器
            unArchiver.finishDecoding()
       
        }
else{//找不到本地文件
            //没找到创建新的
            saveCheckListData()
        }
    }
2014-10-05 06:11:06 xn4545945 阅读数 26018

一起连带前面几篇Playground小结代码都转到github上了,注释写了很多,主要方便自己以后可以翻翻看。Swift语法主要部分差不多就这些了。当然还有泛型、运算符重载、ARC、闭包之类的补充。


一、扩展(extension)

扩展 extension (类似OC中的分类Swift中没有名字), 即在没有权限获取到原始代码的情况下为类增加新功能.

注意: 只要定义了扩展, 那么该扩展对该类的实例都是可用的.

extension SomeType{
    //添加到SomeType的新功能写在这里
}

1.1扩展属性(只能是计算属性)

//扩展可以添加新计算属性, 但是不能添加存储属性(也不可以添加属性观察).
extension Double{  //为API中的已有类型添加实例属性
    var km : Double { return self * 1_000.0 }
    var m : Double { return self }
    var cm : Double { return self / 100.0 }
}

let jjLength = 1.m  // 1与m进行点运算, 表示1的Double值
let jjLength_km = 1.km
println(10.km + 1.m)

1.2扩展构造器

//可以定制自己的构造器
class MyClass{
    var a : Int
    init(){
        a = 10
    }
}

extension MyClass{
    convenience init(var parm:Int){   //扩展构造器
        self.init()
        println("扩展构造器--->便利构造器, \(parm)")
    }
}

var myClass = MyClass(parm: 9)

1.3扩展方法

下面是像Int中扩展myIntFunc方法

extension Int{
    func myIntFunc(){
        println("值为\(self) , 哈哈哈哈!")
    }
}

1.myIntFunc()

1.3.1 修改实例方法

通过扩展方法, 可以修改该实例self本身.但是方法前要加 mutating

extension Double{
    mutating func myMoidfySelfValue{
        self = self * self //修改self实例的值
    }
}

var d = 2.0
d.myMoidfySelfValue()

1.4 扩展嵌套类型

即向已有的嵌套类型中添加新的嵌套类型. 还可以扩展下标(附属脚本).

extension Character {
    enum Kind{   //嵌套了一个枚举类型
        case Big
        case Small
    }
    var k : Kind{
        if(String(self).lowercaseString == "a"){
            return Kind.Big
        }else{
            return Kind.Small
        }
    }
}
var ch : Character = "a"
ch.k   //返回一个枚举值Kind.Big

二、协议(protocol)

可定义方法与属性, 由具体的类去实现. 越来越像Java

Swift中的协议能被类, 枚举,结构体实现.

protocol SomeProtocol{
    //协议内容
}

class SomeClass : SomeProtocol{ //实现协议, 可实现多个协议
    
}

2.1 协议中属性/方法/突变方法的要求

2.1.1 属性的要求

protocol AnotherProtocol1{
    //class表示类成员(结构体/枚举中用static)
    class var property : Int { get set} //get, set 表示可读可写
}

class AnotherClass1 : AnotherProtocol1{
    class var property : Int {  //实现协议中的属性
        get{
            return 10
        }
        set{
            
        }
    }
}

2.1.2 方法要求

//不支持默认参数. 写法上只是没有方法的实现.
protocol AnotherProtocol2{
    func myFunc() -> Int   //只声明不实现
}

class AnotherClass2 : AnotherProtocol2{
    func myFunc() -> Int {  //实现方法
        return 10
    }
}

2.1.3 突变方法要求

能在方法或函数内部改变实例类型的方法称为突变方法. (mutating关键字)

在类中,可以不写mutating, 但在结构体与枚举中国必须写

protocol Togg{
    mutating func togg()
}

enum OnOffSwitch : Togg{
    case Off , On
    
    mutating func togg() { //改变实例的值
        switch self{
        case .Off:
            self = On
        case .On:
            self = Off
        }
    }
}

var lightSwitch = OnOffSwitch.Off
lightSwitch.togg()   //值变为On

2.2 协议类型.

协议也可以当做类型来使用. 这点和函数一样.

1.可作为参数/返回值类型

2.可作为常量/变量/属性的类型

3.可作为数组/字典和其他元素类型

protocol MyRect{
    func myLuckNumber() -> Int
}

class MyRectImp : MyRect{
    func myLuckNumber() -> Int {
        return 10
    }
}

class Dice {
    let sides :Int
    var gener : MyRect    //作为类型
    init(sides:Int, gener:MyRect){  //作为参数
        self.sides = sides
        self.gener = gener
    }
}

var dice = Dice(sides: 6, gener: MyRectImp())
dice.gener.myLuckNumber()   //返回10

示例代码见:http://github.com/xn4545945/SwiftLearning


参考:

The Swift Programming Language  

Apple Dev Center


转载请注明出处:http://blog.csdn.net/xn4545945  



2014-06-10 21:33:28 woaifen3344 阅读数 15203

创建一个基类:Vehicle.swift

import Foundation

//
// @brief 定义一个超类(车)
//
class Vehicle {
    var numberOfWheels: Int
    var maxPassengers: Int
    
    // designated initializer
    init() {
        numberOfWheels = 0
        maxPassengers = 2
        println("call vehicle designated initializer")
        self.nothingToDo()
    }
    
    func description() {
        println("Vehicle has (\numberOfWheels) wheels and can hold \(maxPassengers) passengers at most")
    }
    
    // 使用@final防止被重写
    @final func nothingToDo() {
        println("call nothingToDo() and it is used @final to avoid overriding")
    }
}

再创建一个子类Bicycle.swift:

import Foundation

//
// @brief 定义自行车类
//
class Bicycle : Vehicle {
    // override property
    override var numberOfWheels: Int {
        get { // 重写属性,调用super.propertyName
            println("overried property getter numberOfWheels")
            return super.numberOfWheels
        }
        set {
            println("overried property setter numberOfWheels")
            super.numberOfWheels = max(newValue, 40)
        }
    }
    
    // initializer 默认是不会被继承的
    init() {
        super.init() // initialize super class first
        println("called designated initializer")
        numberOfWheels = 2
    }
    
    // 重写方法
    override func description() {
       super.description()
        
        println("func description() was called in Bicycle")
    }
    
//    // 不能重写
//    override func nothingToDo() {
//        
//    }
}


在main.swift中测试:

import Foundation

let bicycle = Bicycle()

bicycle.numberOfWheels = 4
println(bicycle.numberOfWheels)
bicycle.maxPassengers = 84
println(bicycle.maxPassengers)
bicycle.description()

// 测试结果数据:

call vehicle designated initializer
call nothingToDo() and it is used @final to avoid overriding
called designated initializer
overried property setter numberOfWheels
overried property setter numberOfWheels
overried property getter numberOfWheels
40
84
Vehicle has (
umberOfWheels) wheels and can hold 84 passengers at most
func description() was called in Bicycle
Program ended with exit code: 0



2016-04-13 22:29:18 DearHoneybee 阅读数 1144


在 oc 我们都知道如何使用代理,而如果把oc使用代理的方式也照常用到swift中来,完全没问题!!!No Problem !

至于使用oc的方式使用代理,照搬到swift里面的方式这里我就不累述了,那么现在我来讲一种简洁省事还好用的方法!

蜜蜂哥就是这么无私和为你着想!!!哈哈哈哈

闲言少叙,直接上图!图上我已经把步骤都写好了,请您欣赏!哈哈哈







ios-Swift中的extension

阅读数 181

没有更多推荐了,返回首页