文档章节

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

s
 sj1910
发布于 2016/06/14 19:09
字数 1234
阅读 19
收藏 0

一、函数

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()

 

© 著作权归作者所有

共有 人打赏支持
s
粉丝 0
博文 4
码字总数 9171
作品 0
南京
程序员
私信 提问
swift4.0语法杂记(精简版)

小视频 001--swift简史小视频 002--Playground体验 003--常量&变量 一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯...

阡陌有客
2018/03/23
0
0
swift4.1 学习回顾(9--16)

上一篇中,回顾了一到八节的内容,以及主要的知识点。本次学习做的不太好的一点就是没有及时的回顾,总是在不停的学习新知识,以至于前面的知识遗忘的比较多。现在回顾有一点亡羊补牢的感觉。...

小曼Study
2018/11/12
0
0
Swift3.0 闭包(blcok)的全面介绍及使用

闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。闭包可以捕获和存储其所在上下文...

啪神
2016/12/28
60
0
Swift 3 新变化

Apple 在 WWDC 上已将 Swift 3 整合进了 Xcode 8 beta 中,并会在今年晚些时候发布 Swift 3 的正式版。这是 Swift 在开源和支持 Mac OS X 与 Linux 之后的首个版本。如果你在去年 11 月关注了...

微笑的江豚
2016/08/09
5
0
Swift构造函数

1.构造函数: 给属性开辟内存空间 给属性设置初始值 最终目标创建一个对象 用init构造函数 参数有可能不同 (1)//定义属性使用var 是我们开发需要的 var name: String //可选属性 - 默认等...

KevinEmily
2016/03/06
62
0

没有更多内容

加载失败,请刷新页面

加载更多

Nextjs+React非页面组件SSR渲染

@随风溜达的向日葵 Nextjs Nextjs是React生态中非常受欢迎的SSR(server side render——服务端渲染)框架,只需要几个步骤就可以搭建一个支持SSR的工程(_Nextjs_的快速搭建见Next.js入门)...

随风溜达的向日葵
55分钟前
0
0
如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
今天
3
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
今天
6
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
今天
4
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部