美文网首页
Swift入门二(对象函数)

Swift入门二(对象函数)

作者: Mr姜饼 | 来源:发表于2019-12-19 17:35 被阅读0次

函数

  //内部参数
    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
}

相关文章

网友评论

      本文标题:Swift入门二(对象函数)

      本文链接:https://www.haomeiwen.com/subject/yedmnctx.html