类的定义
 
class Person{
    static let str:String = "我是swift"
     var name:String?
     var age:Int8?
    
    private var sex:Int?
    init() { 
    }
    
    public func setSex(sex:Int)->Person{
        self.sex = sex
        return self
    }
    public func getSex() -> Int?{
        return self.sex
    }
}
var person = Person()
person.setSex(sex: 1).age = 18
person.name = "张三"
print(person.getSex()!,person.age!,person.name!,Person.str)
var person2 = Person()
print(person === person2) 
print(person !== person2) 
 
析构函数
 
deinit{
  
}
 
Any 和 AnyObject
 
var a:Any = 1 
var a:AnyObject = Person() 
 
类的继承 (单继承)
 
class Base{
    private var name:String?
    
    public func setName(name:String?)->Base{
        self.name = name
        return self
    }
    
    public func getName()->String {
        return self.name!
    }
}
class Person:Base{
    
    public override func getName() -> String { 
        return "123"
    }
  
   public func o1(a:Int){
        return
    }
    public func o1(b:Int){ 
        return
    }
  
}
var person = Person()
person.setName(name: "张三")
print(person.getName()) 
var person:Base = Person() 
print(type(of: person)) 
class Person2:Base{
    
    public func sum(a:Int,b:Int)->Int{
        return a * b
    }
}
person = Person2()
if(person is Person2){ 
    let person2 = person as! Person2 
    print(person2.sum(a: 20,b: 10))
}else{
    print("person 不是 Person2 类型")
}
 
扩展 extension
 
extension Base{
  static func toString(){
    print("toString")
  }
}
Person.toString()
 
泛型
 
class Test<T>{
    var name:T?
   
    public func test(a:T)->T{
        return a
    }
}
class Dict<String,V>{
    var key:String?
    var val:V?
}
 
协议 protocol ≈ interface 接口
 
protocol BaseProtocol{ 
    func play(a:Int) -> String 
}
class Base{
    var name:String?
}
protocol BaseProtoco2{
    
    func play() -> String
}
class Test:Base,BaseProtocol,BaseProtoco2{ 
    
     func play(a: Int) -> String { 
        return String(a)
    }
    
    func play() -> String { 
        return self.name!
    }
}
 
类的属性中 包含闭包引用 无法析构
 
class Test{
  var name:String
  lazy var a:()->Void = {  () -> Void  in 
 	     print(self.name)                    
  }
  init(name:String){
    
    self.name = name
  }
  deinit{
    
  }
}
var test = Test("张三")
test = nil 
test = Test("李四")
test!.a()
test = nil 
lazy var a:()->Void = {[unowned self]  () -> Void  in 
 	     print(self.name)                    
  }
 
可选链
 
class Data{
  public func play{
    print("11")
  }
}
class Test{
  var data:Data?
}
var test:Test? = Test()
test.data = Data()
test?.data?.play()  
test!.data!.play() 
 
尾随闭包
 
函数中只有一个参数 并且参数是一个函数类型 或者N个参数 最后一个参数是一个函数类型在函数调用的形参列表后面跟随 闭包 就是尾随闭包
 
func test(param:(Int)->String){
  var val =  param(1)
  print(val)
}
test(){(param)->String in  
      return String(i)
 }
 
异常处理
 
enum TestExeption:String,Error,CaseIterable{ 
    case Error1 = "内部错误" 
    case Error2 = "找不到"
}
func test(i:Int) throws { 
    if(i < 0 ){
        throw TestExeption.Error1
    }else if(i > 0 && i < 10){
        throw TestExeption.Error2
    }else{
        print("正常")
    }
}
do { 
    try test(i: 2)
    print("try")
} catch TestExeption.Error1 {
    print(TestExeption.Error1.rawValue)
}catch TestExeption.Error2{
    print(TestExeption.Error2.rawValue)
}
defer {
    print("这里就是 finally")
}
final class Exe : Error{
    private var code:Int
    private var msg:String
    
   private init(code:Int,msg:String) {
        self.code = code
        self.msg = msg
    }
    
    static let Error1:Exe = Exe(code: 500,msg: "内部错误")
    static let Error2:Exe = Exe(code: 404,msg: "找不到")
}
 
访问权限
 
private  私有类内部
public   公有模块下 导入后 模块外部也能用
internal 公有模块下 导入后 模块外部也不能用 不申明默认就是它
fileprivate 文件内部有效 实现再外部 其他也看不到只能自己用
open 和 public 的区别是:open 可以在其他模块中被继承、重载。 public 不可以 只能被访问