Swift 基础4

十三. 类的构造函数

1. 构造函数的介绍

  • 构造函数类似于OC中的初始化方法:init方法
  • 默认情况下载创建一个类时,必然会调用一个构造函数
  • 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数。
  • 如果是继承自NSObject,可以对父类的构造函数进行重写

2.构造函数的基本使用

2.1 构造函数的基本使用
  • 类的属性必须有值
  • 如果不是在定义时初始化值,可以在构造函数中赋值
class Person: NSObject 

var name : String

var age : Int

// 重写了NSObject(父类)的构造方法

override init() 

name = ""

age = 0

}

}

// 创建一个Person对象

let p = Person()
2.2 初始化时给属性赋值
  • 很多时候,我们在创建一个对象时就会给属性赋值
  • 可以自定义构造函数
  • 注意:如果自定义了构造函数,会覆盖init()方法.即不在有默认的构造函数
class Person: NSObject 

var name : String

var age : Int

// 自定义构造函数,会覆盖init()函数

init(name : String, age : Int) 

self.name = name

self.age = age

}

}

// 创建一个Person对象

let p = Person(name: "ryan", age: 18)
2.3 字典转模型(初始化时传入字典)
  • 真实创建对象时,更多的是将字典转成模型
  • 注意:
    • 去字典中取出的是NSObject,任意类型.
    • 可以通过as!转成需要的类型,再赋值(不可以直接赋值)
class Person: NSObject 

var name : String

var age : Int

// 自定义构造函数,会覆盖init()函数

init(dict : String : NSObject) 

name = dict"name" as! String

age = dict"age" as! Int

}

}

// 创建一个Person对象

let dict = "name" : "ryan", "age" : 18

let p = Person(dict: dict)
2.4 字典转模型(利用KVC转化)
  • 利用KVC字典转模型会更加方便
  • 注意:
    • KVC并不能保证会给所有的属性赋值
    • 因此属性需要有默认值
      • 基本数据类型默认值设置为0
      • 对象或者结构体类型定义为可选类型即可(可选类型没有赋值前为nil)
class Person: NSObject 

// 结构体或者类的类型,必须是可选类型.因为不能保证一定会赋值

var name : String?

// 基本数据类型不能是可选类型,否则KVC无法转化

var age : Int = 0

// 自定义构造函数,会覆盖init()函数

init(dict : String : NSObject) 

// 必须先初始化对象

super.init()

// 调用对象的KVC方法字典转模型

setValuesForKeysWithDictionary(dict)

}

}

// 创建一个Person对象

let dict = "name" : "ryan", "age" : 18

let p = Person(dict: dict)

十四. 闭包

1. 闭包的介绍

  • 闭包和OC中的block非常相似

    • OC中的block是匿名的函数
    • Swift中的闭包是一个特殊的函数
    • block和闭包都经常用于回调

2. 闭包的使用

2.1 block的用法回顾
  • 定义网络请求的类
@interface HttpTool : NSObject
- (void)loadRequest:(void (^)())callBackBlock;

@end

@implementation HttpTool
- (void)loadRequest:(void (^)())callBackBlock
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSLog(@"加载网络数据:%@", [NSThread currentThread]);

dispatch_async(dispatch_get_main_queue(), ^{
    callBackBlock();
    });
  });
}
@end
  • 进行网络请求,请求到数据后利用block进行回调
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{
  [self.httpTool loadRequest:^{
    NSLog(@"主线程中,将数据回调.%@", [NSThread currentThread]);
  }];
}
  • block写法总结:
block的写法:
    类型:
    返回值(^block的名称)(block的参数)

  值:
^(参数列表) {
  // 执行的代码
};
2.2使用闭包代替block
  • 定义网络请求的类
class HttpTool: NSObject {

func loadRequest(callBack : ()->()){
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
      print("加载数据", [NSThread.currentThread()])

 dispatch_async(dispatch_get_main_queue(), { () -> Void in
      callBack()
 })
    }
  }
}
  • 进行网络请求,请求到数据后利用闭包进行回调
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        // 网络请求
        httpTool.loadRequest ({ () -> () in
              print("回到主线程", NSThread.currentThread());
        })
     }
2.3 闭包写法总结:
 2.3.1闭包的写法:
类型:(形参列表)->(返回值)
技巧:初学者定义闭包类型,直接写()->().再填充参数和返回值

值:
{
(形参) -> 返回值类型 in
  // 执行代码
}
  2.3.2闭包的简写
  • 如果闭包没有参数,没有返回值.in和in之前的内容可以省略
httpTool.loadRequest({
        print("回到主线程", NSThread.currentThread());
     })
        
  • 尾随闭包写法:

    • 如果闭包是函数的最后一个参数,则可以将闭包写早()后面
    • 如果函数只有一个参数,并且这个参数是闭包,那么()可以不写
httpTool.loadRequest() {
            print("回到主线程", NSThread.currentThread());
        }
        // 开发中建议该写法
        httpTool.loadRequest {
            print("回到主线程", NSThread.currentThread());
        }
  2.3.3 闭包的循环引用
  • 如果在HttpTool中有对闭包进行强引用,则会形成循环引用
class HttpTool: NSObject {

// 定义属性,来强引用传入的闭包
var callBack : (()->())?

func loadRequest(callBack : ()->()){
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
      print("加载数据", [NSThread.currentThread()])

 dispatch_async(dispatch_get_main_queue(), { () -> Void in
      callBack()
 })
}

self.callBack = callBack
  }
}
  • swift中解决循环引用的方式
// weak var weakSelf = self;
        // [weak self] () -> () in
        // [unowned self] () -> () in
        httpTool.loadRequest { [unowned self] () -> () in
        self.view.backgroundColor = UIColor.redColor()
             print("回到主线程", NSThread.currentThread());
        }

十五 懒加载

1. 懒加载的介绍

  • swift中也有懒加载的方式

    • (苹果的设计思想:希望所有的对象在使用时才真正加载到内存中)
  • 和OC不同的是swift有专门的关键字来实现懒加载
  • lazy关键字可以用于定义某一个属性懒加载

2. 懒加载的使用

  • 格式
lazy var 变量: 类型 = { 创建变量代码 }()
  • 懒加载的使用
// 懒加载的本质是,在第一次使用的时候执行闭包,将闭包的返回值赋值给属性
        // lazy的作用是只会赋值一次
        lazy var array : [String] = {
        () -> [String] in
            return ["ryan", "szy", "jack"]
        }()
时间: 2024-10-08 04:26:59

Swift 基础4的相关文章

从Pitre《Swift 基础教程2nd》开始

看了两天<Learn Objective-C on the MAC> 中文版本<Objective-C基础编程>,大概认真读到了第9章内存管理部分,感觉这语言可比C++简单多了. 第一天,因为有C语言基础的缘故,我在windows 上安装了GNUstep (Objective-C)开发环境,变看电子书籍,边在PC上编译运行树上的示例,几乎一个都没放过,还做了不少笔记. (毕竟作者 Mark Dalrymaple & Scott Knaster 是高屋建瓴,叙述技术娓娓道来,

3.Swift基础知识

Swift是用来开发iOS和OS X应用的新语言,但是许多地方用起来跟C或者OC是差不多的. Swift提供了C语言和OC的基本数据类型,比如整型用Int,浮点型用Double或者Float,布尔型用Bool,字符串文本用String,Swift还提供了两种集合类型,Array和Dictionary,后面会介绍. Swift也跟C一样用唯一的变量名来存储与使用数据,还能使用一些值不会变的变量,应该说是常量,比C里面的常量要强大.在涉及到一些值不会发生变化的数据时使用常量类型能让代码更安全整洁.

随手记Swift基础和Optional Type(问号?和感叹号!)

距离Apple推出Swift已经有几天了,网上也时不时出现"急招Swift程序员,要求有一天工作经验"的帖子. 看到Swift,除了苹果放的另外一门语言的链接(http://swift-lang.org/),还可能联想到Taylor Swift,或者铃木雨燕. 这几天网上关于Swift的话题和材料应该迅速膨胀,比如StackOverflow的相关标签,还有知乎上的一些相关讨论. 关于Swift的推出,我个人觉得对现有的使用Objective-C的iOS开发者不算是很大的冲击,毕竟写代码

Swift基础语法(常量变量、数据类型、元组、可选、断言等)

Swift 是 iOS 和 OS X 应用开发的一门新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的. Swift 的类型是在 C 和 Objective-C 的基础上提出的,Int是整型:Double和Float是浮点型:Bool是布尔型:String是字符串.Swift 还有两个有用的集合类型,Array和Dictionary,请参考集合类型. 就像 C 语言一样,Swift 使用变量来进行存储并通过变量名来关联值.在 Sw

Swift学习——Swift基础详解(四)

A:小儿编程很不好! B:多半是不爱学,从看英文版开始,让你爱上编程! Type Aliases    类型重定义(typedef) Swift中重定义类型的关键字是typealias,至于怎么用,应该不必多说了,看例子: typealias AudioSample = UInt16 //定义了一个类型名称AudioSample,代表UInt16类型 var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound is now 0 Boo

Swift基础 - - 高德地图实践(一)

高德地图开发需要自己到官网http://lbs.amap.com/console/ 注册一个ak,新建一个swift工程,然后在Info.plist中添加一个NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription. 高德地图的库以及依赖库加入到项目里面 需要的库如下截图: 添加头文件 具体的方式见Swift基础--调用第三方OC项目,在Bridging-Header.h中加入如下代码,这样我们就可以调用高德地图相

Swift学习——Swift基础详解(一)

注:由于基础部分在Swift Tour 中已经大体的说明了,所以在详解中不会达到100%的原文释义 Constants and Variables  常量和变量 常量和变量都需要声明名称和类型(作为程序员,这些基础也就不说了),常量一次赋值不能改变,变量的值可以改变 Declaring Constants and Variables   声明常量和变量 常量和变量在使用之前必须要声明,使用let关键字定义常量,var关键字定义变量 下面的例子可以用来定义用户登录的时候最大的尝试次数: let m

Swift学习——Swift基础详解(二)

上节说了没有营养的变量和常量,这玩意,都差不多,自己稍微看下就好了 Integers    整型 整数就是整数了,没有小数,整数有符号(+,-,0)或者无符号(0,+) Swift提供了8,16,32,64位的有符号和无符号的整数,命名使用C的方式,比如,8位无符号的整型UInt8,32位有符号的整型就是Int32 Integer Bounds    整型范围 可以使用min 和 max获取整数类型的最大值和最小值 let minValue = UInt8.min // minValue is

Swift学习——Swift基础详解(三)

小葵花课堂继续开讲 Numeric Literals    数字文本 数字文本有以下几种写法: A decimal number, with no prefix A binary number, with a 0b prefix An octal number, with a 0o prefix A hexadecimal number, with a 0x prefix 十进制数,无前缀:二进制数,0b前缀:八进制数,0o前缀:十六进制数,0x前缀 论数字17的N种表现形式: let deci

Swift学习——Swift基础详解(八)

Assertions    断言 可选可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况.然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能并不需要继续执行.这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因. Debugging with Assertions    使用断言进行调试 断言会在运行时判断一个逻辑条件是否为true.从字面意思来说,断言"断言"一个条件是否为真.你可以使用断言来保证在运行其他代