函数
//内部参数
func sum(x : Int , y :Int) -> Int {
return x + y
}
//外部参数
func sum(num1 x : Int , num2 y :Int) -> Int {
return x + y
}
func sum(_ x : Int ,_ y :Int) -> Int {
return x + y
}
//在swift中“_”下划线可以忽略任何不敢新股的内容
for _ in 0...9{
print ("heloo")
}
func createSubView(topView : UIView) -> UIView {
return UIView()
}
//默认值
//通过给参数设置默认值,在调用的时候,可以任意组合参数,如果不指定,则使用默认值
func sum3( x : Int = 1 , y :Int = 2) -> Int {
return x + y
}
//使用
sum3(); sum3(x:20) sum3(y:22)
//无返回值
-> : 输出的目标
func demo1() -> () {
}
func demo1() -> Void {
}
func demo1(){
}
闭包
let a1 = sum
a1(x:1, y :2)
func sum( x : Int , y :Int ) -> Int {
return x + y
}
//最简单的闭包(swift)
let b1 = {
print ("hello")
}
//执行
b1()
//最简单的block(OC)
void (^b1)() = ^{
Nslog(@"hello");
}
//执行
b1()
//带参数的闭包(swift)
//闭包中,参数、返回值、和实现代码块 都是写在 {} 中
//{ 形参列表 -> 返回值 // 实现代码块 }
//需要使用关键字 ‘in’
let b2 = { (x:Int)-> () in
print (x)
}
b2(100)
//带参数带返回值的闭包
let b2 = { (y:Int)-> Int in
print (x)
return x
}
b2(100)
GCD
loadData { (result)in
print("获取到的数据为 \(result)")
}
func loadData(complete : @escaping ([String] , Bool) -> Void ) -> (){
DispatchQueue.global().async {
print("请求数据耗时操作 \(Thread.current)")
Thread.sleep(forTimeInterval: 2)
let Json = ["ss","111","333"]
DispatchQueue.main.async {
print("主线程更新UI \(Thread.current)")
complete(Json,false)
}
}
}
尾随闭包
loadData { (result,flag) in
print("获取到的数据为 \(result)")
}
=> 等价于
loadData(complete: {
(result , flag) in
})
闭包循环引用解决(OC)
blcok中
weak var weakSelf = self //不能用let
loadData{
print (weakSelf?.view)
}
用?可选解包 不要用!强行解包
负责执行 ,不负责计算
闭包循环引用解决(swift推荐)
loadData{ [weak self] in
print (self?.view)
}
//unowned是assin类型,当对象释放了之后,不会被强引用,但是会出现野指针,(不推荐,了解就好)
loadData{ [unowned self] in
print (self.view)
}
面向对象
命名空间:
同一个项目的对象 ,拥有同一个命名空间
构造函数(override)
class Person: NSObject {
var name : String
override init() {
name = ""
super.init()
}
}
1.给自己的属性分配空间并且设置初始值
2.调用父类的构造函数,给父类的属性分配空间,设置初始值
***与OC中是相反的
1.调用父类的构造函数,给父类的属性分配空间,设置初始值
2.给自己的属性分配空间并且设置初始值
class Student: Person {
var num : String
override init() {
num = "001"
super.init()
}
}
重载函数(OC中没有)
函数名与父类的构造函数相同但是参数和个数不同
class Person: NSObject {
var name : String
// 重写
override init() {
name = ""
super.init()
}
//重载,可以给自己的属性从外部设置初始值
init(name : String) {
self.name = name
super.init()
}
}
*如果重载了构造函数,而没有实现重写构造函数,那么系统不会提供默认的构造函数,因为默认的构造函数,不能给本类的属性分配空间
class Student: Person {
var num : String
init(name : String , num : String) {
self.num = "001"
super.init()
}
}
Student(name:"老王",num : "001")
KVC(构造函数)
//延迟加载
class Person: NSObject {
//如果设置成private 属性/方法,外部无法访问
// private var title : String? //在使用KVC设置的时候,无法进行设置,不能设置成私有的
var name : String? //可选
var age : Int = 0
//var age : Int ? //此处会崩溃,使用基本数据类型,不能设置成可选的,而且要设置初始值,
//重载
init (dic : [String : AnyObject]){
//注意 ,在调用self的方法setValueForKeys 之前 应该调用 super.init进行初始化
//KVC的方法,是OC的方法,是在运行时给对象发消息,所以必须要求对象已经实例化完成
super.init()
setValueForKeys(dict)
}
}
Person(dict : ["name" : "asd" , age : 10 ])
运行时(Swift)
class Person: NSObject {
var name : String?
var tiitle : String?
var age : Int = 0
class func propertyList() -> [String]{
var count : UInt32 = 0
//1.获取类的属性列表,
let list = class_copyPropertyList(self, &count)
print("属性的数量 \(count)")
//2.遍历数组
for i in 0..<Int(count){
//3.根据下标取属性
let pty = list?[i]
//4.获取属性的名称 (c语言的字符串)
//Int8 -> 8byte -> char => c语言
let cName = property_getName(pty!)
print(cName)
//转换成oc的字符串
let name = String(utf8String: cName)
print(name)
}
return []
}
//Person.propertyList()
}
修改版
for i in 0..<Int(count){
//3.根据下标取属性
guard let pty = list?[i]
else{
continue
}
//4.获取属性的名称 (c语言的字符串)
//Int8 -> 8byte -> char => c语言
let cName = property_getName(pty)
print(cName)
//转换成oc的字符串
let name = String(utf8String: cName)
print(name ?? "")
}
便利构造函数
/*
1.便利构造函数允许返回nil
正常的构造函数一定会返回对象
2.只有在便利构造函数中才会使用 self.init() 构造当前对象
没有convenience的构造函数是负责创建对象的,反之用来检查条件的,本身不负责对象的创建
3.如果要在便利构造函数中使用当前对象的属性,一定要在self.init()之后
*/
convenience init? (name : String , age : Int) {
if age > 100{
return nil
}
self.init()
self.name = name
self.age = age
}
**比如
let url = URL(string: "https://www.badi.com/中文")
let session = URLSession.shared
//此次会崩溃,惊叹号强行解包空值
session.dataTask(with: url!) { (data, _, error) in
}.resume()
利用便利构造函数抽取控件创建方法
import UIKit
extension UITextField {
convenience init(textColor : UIColor = UIColor.gray , placeholder : String , fontSize : CGFloat ) {
self.init()
self.textColor = textColor
self.placeholder = placeholder
self.font = UIFont(name: "", size: fontSize)
}
}
deinit
//没有 func -> 不让调用
//没有 () -> 不让重载
//在对象销毁前 自动调用
deinit{
//1.通知(如果没有注销不会崩溃,会造成内存泄漏)
2.KVO(如果没有注销会崩溃)
3.NSTimer ,CADispalyLink
}
网友评论