一、函数
1.swift是允许函数嵌套,并且外部不可见
2. 调用的时候尽量不采用self
3.类方法调用的函数前面加上class
4. 如果一个类只要求本类中调用,不希望外部可见,就加上private,UI控件的响应事件,不要加上private修饰
5.override 表示函数继承父类
1>.无参无返
func demo01(){
print("无参无返")
// 函数嵌套
func demo011(){
print("----------------")
}
// 调用函数
demo011()
}
func demo02()->(){
print("无参无返02")
}
func demo03()->Void{
print("无参无返03")
}
2>.有参无返
注意:非第一个参数,如果没有外部访问参数,会将形参当成外部访问参数
func lengthOfString(str1 str1:String,str2:String){
print("\(str1)和\(str2)的长度是\(str1.characters.count + str2.characters.count)")
}
3>.无参有返
class func demo04()->String{
return "258963"
}
4>.有参有返
注意:第二个是用中文写的方法名和参数
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>.无参无返
let clouse = {
()->()
in
print("这是一个无参无返的闭包")
}
2>.有参无返
let clouse1 = {
(str:String)->()
in
print("有参无返,参数为\(str)的闭包")
}
3>.无参有返
let clouse2 = {
()->(Int)
in
let str = "sdsdsdssdsdsd"
return str.characters.count
}
4>.有参有返
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>.声明一个函数
func newStringLength(str1:String,clouse1:(str2:String)->String)->Int{
let str3 = clouse1(str2: str1)
return str3.characters.count
}
2>.在viewDidLoad调用
使用的时候闭包参数直接回车就会是下面样式
let count = newStringLength("hello") { (str2) -> String in
let str5 = "\(str2)world"
return str5
}
print(count)
三、类
1.声明属性以及set方法和初始化方法
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. 如果重载了初始化方法,并且没有提供系统默认的初始化方法,并且没有提供系统默认的初始化方法,外界是无法访问到系统默认的初始化方法
原因:没有提供系统默认的初始化方法,调用系统默认的初始化方法时,变量找不到地方初始化
init(name:String,age:Int) {
super.init()
self.name = name
self.age = age
}
4.类方法
// 写法一:
// 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)
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) {
}
五、单例
// 单例写法
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修饰
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()
七、网络请求
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()