类的定义
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 person1:Base = Person()
print(type(of: person))
class Person2:Base{
public func sum(a:Int,b:Int)->Int{
return a * b
}
}
person1 = Person2()
if(person1 is Person2){
let person2 = person1 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(param)
}
异常处理
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")
}
访问权限
private 私有类内部
public 公有模块下 导入后 模块外部也能用
internal 公有模块下 导入后 模块外部也不能用 不申明默认就是它
fileprivate 文件内部有效 实现再外部 其他也看不到只能自己用
open 和 public 的区别是:open 可以在其他模块中被继承、重载。 public 不可以 只能被访问