swift的函数,闭包,单例,KVC以及协议的基本写法

前端之家收集整理的这篇文章主要介绍了swift的函数,闭包,单例,KVC以及协议的基本写法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、函数

1.swift是允许函数嵌套,并且外部不可见

2. 调用的时候尽量不采用self


3.类方法调用函数前面加上class


4. 如果一个类只要求本类中调用,不希望外部可见,就加上private,UI控件的响应事件,不要加上private修饰

5.override 表示函数继承父类

1>.无参无返

@H_404_34@func demo01(){ print("无参无返") // 函数嵌套 func demo011(){ print("----------------") } // 调用函数 demo011() } func demo02()->(){ print("无参无返02") } func demo03()->Void{ print("无参无返03") }

2>.有参无返

注意:非第一个参数,如果没有外部访问参数,会将形参当成外部访问参数

@H_404_34@func lengthOfString(str1 str1:String,str2:String){ print("\(str1)和\(str2)的长度是\(str1.characters.count + str2.characters.count)") }

3>.无参有返

@H_404_34@class func demo04()->String{ return "258963" }

4>.有参有返

注意:第二个是用中文写的方法名和参数

@H_404_34@func demo05(var str1 a:String,str2 b:String)->String{ a += b return a } func 返回拼接参数(第一个参数 str1:String,第二个参数 str2:String)->String{ // let str3 = "\(str1)\(str2)" // return str3 return str1 + str2 }

二、闭包

1.相当于OC里面block,封装了一段有特定功能代码块,且 闭包也可以当做函数的参数

1>.无参无返

@H_404_34@let clouse = { ()->() in print("这是一个无参无返的闭包") }

2>.有参无返

@H_404_34@let clouse1 = { (str:String)->() in print("有参无返,参数为\(str)的闭包") }

3>.无参有返

@H_404_34@let clouse2 = { ()->(Int) in let str = "sdsdsdssdsdsd" return str.characters.count }

4>.有参有返

@H_404_34@let clouse3 = { (str1 str1:String,str2 str2:String)->(Int) in let a = str1.characters.count let b = str2.characters.count return a + b }

2.闭包当做函数参数

1>.声明一个函数

@H_404_34@func newStringLength(str1:String,clouse1:(str2:String)->String)->Int{ let str3 = clouse1(str2: str1) return str3.characters.count }

2>.在viewDidLoad调用

使用的时候闭包参数直接回车就会是下面样式

@H_404_34@let count = newStringLength("hello") { (str2) -> String in let str5 = "\(str2)world" return str5 } print(count)

三、类

1.声明属性以及set方法和初始化方法

@H_404_34@var name:String? var age:Int? // swift 里面set方法:var 变量名:类型?{ // didSet{ // } // } var gender:String?{ didSet{ print("gender=\(gender!)") } } // 注意:必选类型必须在对象初始化之前进行赋值 // 上面属性为可选类型 override init() { name = "lisi" age = 12 super.init() }

2.重载步骤和OC一样,如果成员变量是必选类型的话,一样要在调用 super.init之前初始化
3. 如果重载了初始化方法,并且没有提供系统默认的初始化方法,并且没有提供系统默认的初始化方法,外界是无法访问到系统默认的初始化方法
原因:没有提供系统默认的初始化方法调用系统默认的初始化方法时,变量找不到地方初始化

@H_404_34@init(name:String,age:Int) { super.init() self.name = name self.age = age }

4.类方法

@H_404_34@// 写法一: // class 修饰的类方法,能够被子类重载 class func PersonWithNameAndAge(name:String,age:Int)->Person{ return Person.init(name: name,age: age) } // 写法二: // static修饰也表示类方法,不能被子类重载 static func drinkWater(){ print("person drink water") }

四、KVC

1. KVC 调用流程:KVC(是一种通过字符串间接访问对象属性的一种方式)
1>.setValuesForKeysWithDictionary
2>.setValue(,forKey)如果有找到对象的key值,则初始化并且赋值
3>.setValue(,forUndefinedKey)

@H_404_34@var name:String? var age:Int = 0// 基本数据类型在模型里面不能为可选类型,否则KVC赋值时找不到key,给默认值 0 var gender:String? init(dic:[String:AnyObject]){ super.init() setValuesForKeysWithDictionary(dic) } override func setValue(value: AnyObject?,forKey key: String) { super.setValue(value,forKey: key) } override func setValue(value: AnyObject?,forUndefinedKey key: String) { }

五、单例

@H_404_34@// 单例写法 static let shareInstance:SingleTon = { let instance = SingleTon() return instance }() // 单例写法二,类似于一个类方法 static let instance = SingleTon() class func shareSingleTon()->SingleTon { return instance }

六、协议

1.关键词 protocol

2.protocol 标志符如果前面没有@objc的话,表示协议里面的所有方法都必须实现

3.如果协议里面有一些方法是选择实现的,必须在标识符protocol前面加上@objc ,并且选择实现的那些方法前面加上optional修饰

@H_404_34@protocol womanDelegate{ func makeMoney() } @objc protocol womanOptionalDelegate{ optional func makeDiner() func introduceSelf() } // 设置代理 class Woman: NSObject { var delegate:womanDelegate? var optionalDelegate:womanOptionalDelegate? } // 在viewController里面实现方法,并在ViewDidLoad调用 let woman = Woman() woman.delegate = self woman.optionalDelegate = self woman.delegate?.makeMoney() woman.optionalDelegate?.introduceSelf()

七、网络请求

@H_404_34@let urlStr = "http://project.lanou3g.com/teacher/yihuiyun/lanouproject/cinemalist.PHP" let url = NSURL(string: urlStr) // 写闭包回调的时候要把参数都写成可选类型 let dataTask = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data,response,error) -> Void in // try 如果有出错的话警告 // try! 如果有出错的话程序崩溃 // try? 返回值是可选类型的 // do - catch swift提供的异常抛出机制,程序没问题执行do,出错时捕获异常,执行catch if let temp = data{ do{ let rootDic = try NSJSONSerialization.JSONObjectWithData(temp,options: NSJSONReadingOptions.MutableContainers) print("success") }catch{ print(error) } } } dataTask.resume()

猜你在找的Swift相关文章