Swift数据类型至少要知道这些

可选型optional

  1. 可选型本质上是一个枚举类型enum
enum Optional<T> {// The <T> is a generic like as in Array<T>
    case none
    case some(T)
}

以下两种写法是等价的

let x:String? = nil
... is ...
let y = Optional<String>.none

let x:String? = "Hello"
... is ...
let x = Optional<String>.some("Hello")

// unwrap
let y = x!
...is...
switch x {
    case .some(let value):y = value
    case .none:// raise an excepiton
}

let x:String? = ...
if let y = {
    // do someting with y 
}
... is ...
switch x {
    case .some(let y):// do something with y
    case .none:break
}
  1. 可选型是可以链式传递的
var display:UILabel?
if let temp1 = display {
    if let temp2 = temp1.text {
        let  x = temp2.hashValue
        //...
    }
}
// 等价于 链式解包如果中间有一个为nil,返回的值为nil
if let x = display?.text.hashValue // x is an Int
let x = display?.text.hashValu // x is an Int?
//因此在链式解包时使用?而不是!
  1. 可选默认值操作符??

    如果可选型解包值为nil,则赋予默认值

let s: String? = ...
if s != nil {
    display.text = s
}else {
    display.text = ""
}
// 等价于
display.text = s??""

元组 tuple

tuple is a grouping of values

You can use it anywhere you can use a type.

let x: (String,Int,Double) = ("Hello",5,0.85)// the tyoe of x is a tuple
let (word,number,value) = x// this names the tuple emlements when accessing the tuple 当元组被访问时,命名元组内的元素
print(word)// hello
print(number)// 5
print(value)// 0.85
// 当元组被声明的时候也可以为元组元素命名 建议使用这种,tuple 可以通过点语法访问元组内的元素
let y:(x:String,i:Int,v:Double) = ("Hello",5,0.85)
print(y.x)
print(y.i)
print(y.v)
// 可以使用下划线忽略元组中元素
let (word,_,value) = x

Range

A range in swift is just tow end Points.

A range can represent things like a selection in some text or a portion of an Array

Range is generic(e.g. Range<T>), but T is restricted(e.g. comparable).

类似于这种

struct Range<T> {
    var startIndex:T
    var endIndex:T
}

CountableRange 包含的值可以迭代或者用下标访问

创建Range有一种特殊的语法

..< 不包含上限。

...包含上限

CountableRange 可以用for in 遍历

// C-like : for (i = 0;i<20;i++)
for i in 0..<20 {
    
}
// 浮点数不是countable的 对于 for(i=0.5;i<=15.25;i+=3) 是无法直接使用forin的,但是有一个通用的方法可以从浮点数创建一个CountableRange
for i in stride(from:0.5,through:12.25,by:0.3){
    
}

数据结构 struct,enum,class

相似点:

语法声明相似

class ViewController: ... {
    
}

struct Calculation {
    
}

enum Opration {
    
}

都可以拥有属性和方法

func doit(agrx agri:Type)->ReturnValue{
    
}
var storedProperty =<initial value>(not enum)

var computedProperty:Type {
    get{}
    set{}
}

初始化(not enum)

init(arg1x arg1i:Type,arg2x arg2i:Type ...){
    
}

不同点:

  1. 只有class可以继承

  2. struct 和 enum是值(value)类型,而class是引用类型(inference)

值类型(如struct,enum)特点如下:

Copied when passed as an argument to a founction

Copied when assigned to a different variable

Immutable if assigned to a variable with let (function parameters are let)

You must note any func that can mutate a struct/enum with the keyword mutating

引用类型(如class)特点如下:

Stored in the heap and reference counted(automatically)

Constant Pointers to a class (let) still can mutate by calling methods and changing properties

When passed as an argument, does note make a copy (just passing a pointer to same instance)

参数名称

对于所有的方法而言所有的参数都有一个内部名称和外部名称,

内部名称是在方法内使用的局部变量

外部名称是调用者调用方法时使用的名称

如果不想让调用者使用外部名称,可以使用下划线忽略外部名称,

如果只提供了一个参数名,这个参数名即是外部名称又是外部名称

类型和方法都可以拥有方法和属性

类型的方法和属性都需要使用static关键词修饰

比如Double这个struct类型有一系列变量和方法在这个类型上

比如访问 Double.pi 访问的不是实例的属性而是类型的属性

属性观察

可以通过willSet和didSet来观察属性值的更改。

如果修改了一个结构体,也会包含这种变化

var someStoredProperty:Int = 42 {
    willSet{newValue is the new value}
    didSet{oleValue is the old value}
}
// 继承的属性也可以观察 重新父类的属性和方法都需要使用关键词override
override var inheritedProperty:String{
    willSet{newValue is the new value}
    didSet{oleValue is the old value}
}
// 架构体的变化也可以捕获
var opertaions:Dictionary<String,Operation>=[...]{
    willSet{will be executed if an opreation is added/removed}
    didSet {will be executed if an opreation is added/removed}
}

懒加载

使用lazy关键词修饰,这种变量只有在访问的时候才会初始化,可以通过执行闭包或者调用方法来创建一个对象

lazy var brain = CalulatorBrain()
lazy var someProperty:Type = {
    // construct the value of someProperty 
    return <the constructed value>
}()
lazy var myProperty = self.initialiedMyProperty()

初始化

  1. 什么时候需要init方法

init方法不是非常常见,因为

  • 属性可以使用=赋予默认值
  • 属性也可以使用可选型,这种情况下初始值为nil
  • 属性也可以使用懒加载

因此,当上述方面不能满足时,需要初始化方法。

  1. 有些初始化方法不用自己写就可以使用
  • 基类的init()方法
  • 如果结构体没有初始化方法,会有默认的初始化方法包含所有的参数
  1. 在init方法中需要做什么

    当初始化完成之后,所有属性都应当有值(可选型可以为nil)

    在class中有两种初始化方法 convenience and designated

    1. a designated init must (and can only) call a designated init that is in its immediate supercalss
    2. you must initialize all properties introduced by your calss before calling a supercalss' init
    3. You must call a supercalss' init before you assign a value to an inherited property
    4. a convenience init must ( and can only) call an init in its own class
    5. a convenience init must call that init before it can set any property values
  2. 可以失败的初始化

如果init声明为init?,它将返回一个可选型,初始化失败时为nil

比如

let image = UIImage(named:"foo")// image is an Optional

类型转换

可以使用as?来进行类型转换,尤其在有使用到Any类型,以及父类像子类转换时很常见

断言

可以使用assert在调试时帮助调试,

assert(()->Bool,"message") 这个函数的参数时自动闭包,所以不需要{}

条件为假时,给出后面的信息。

当编辑为release版本时,断言会完全被忽略。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容