老上海的民国风情,张爱玲的《小团圆》在此间续演

简介

  • 特点
    (1)优于OC,快速,安全
    (2)撤销了预编译指令包括宏定义(OC用的太多了)
    (3)裁撤了OC指针和不安全访问的运用(看不到星星了)
    (4)抛弃 Objective-C 早期采纳 Smalltalk 的语法,周详改为点语法
    (5)3.0中对Foundation框架做了成千上万变更,去除了NS,将大举class转换成struct结构体(为了考虑性能和安全性,绝大部分用到结构体来代替原先的类,然而在其实使用感觉不到)
    (6)可以使用现有的 Cocoa 和 Cocoa Touch 框架
    , 从前是OC调UI基特(Kit),现在就是Swift(Swift)调UI基特(Kit),那一点事没问题的
    (7)斯威夫特(Swift)(Swift)因为语法的严俊性可以让很多荒唐提前碰到,那样很少出现bug让程序停在main导致不可以找到
    (8)@UIApplicationMain是先后的输入
    (9)只有.h没有.m
    (10)所有的代码都包括在{}里,默认方法func都有缩进!
    (11)语法的allocinit替换成()

  • PlayGround
    (1)可以看苹果官方自带的tips和100个tips,都在Placground来选择

  • 基础点
    (1)不适用self. 在闭包或者编译器提示的时候再拔取
    (2)分号是用来分割语句的,假诺一行洗很多,就足以加分号,一般时候可以不加
    (3)#function打印执行的函数
    (4)添加标记用到// MARK: – 选取,淌如果接下去要做的可以用//
    TODO:和// FIXME:这个非凡实惠

图片 1

一、常量和变量

在这一刹那间,一切都变得可怜明显,下着百叶窗的漆黑的餐室,饭已经开上桌子,没有金鱼的金鱼缸,白瓷缸上细细描出橙红的鱼藻。 ——张爱玲

定义

  • let 定义常量,一经赋值不容许再修改
  • var 定义变量,赋值之后依然可以修改
    常量和变量的底细

  • 使用 : 类型,仅仅只定义类型

  • 常量有三遍设置的机遇
  • 有道是尽可能先采纳常量,只有在必须修改时,才需要修改为 var

// 定义常量并且直接设置数值
let x: Int = 10
// 常量数值一经设置,不能修改,以下代码会报错
// x = 30

let y: Int
// 常量有一次设置的机会,以下代码没有问题,因为 `y` 还没有被设置数值
y = 10

// 一旦设置之后,则不能再次修改,以下代码会报错,因为 `y` 已经被设置了数值
// y = 50

print(x + y)

// 变量设置数值之后,可以继续修改数值
var z: Int
z = 100
z = 200

print(x + y + z)

深夜,有微弱阳光透过花窗,落在青砖地面上,留下斑驳倒影。

机关推导

斯威夫特(Swift) 可以依照左边的代码,推导出变量的高精度类型
只有一致档次的值才可以举办演算

// 整数默认的类型是 Int
let intValue = 200
// 小数的默认类型是 Double
let doubleValue = 10.5

// 如果要对不同类型的数据进行计算,必须要显式的转换
print(intValue + Int(doubleValue))
print(Double(intValue) + doubleValue)

留意:斯维夫特对项目要求十分严峻,任何例外类其它数码无法一贯运算(哪怕是Int和Double),不会做一些电动的更换到转换成Double。斯维夫特(Swift)不设有基本数据类型,Int和Double都是结构体其实,强转用Double(x)完成,或者在概念的时候一向指定变量的品类let
x : Double = 10;(很少使用)

穿过观前街,钻进这条依偎在小河边的井巷,推开黑木门,这是一座由世纪马尔默旧居改造而成的饭店,名叫小眸园。

二、控制流

图片 2

if

  • 斯威夫特(Swift)(Swift) 中没有 C 语言中的非零即真概念
  • 在逻辑判断时务必出示地指明具体的判定标准 true / false
  • if 语句条件的 () 能够省略
  • 而是 {} 不可能大概

let num = 100

if num > 10 {
    print("大 \(num)")
} else {
    print("小 \(num)")
}

反观过去,大隐于市。无论外界多么喧闹,小眸园始终沉浸在宁静平和的氛围里,夜间十二分僻静,白天仍是可以够听见德雷斯顿小街里久久的叫卖声。

三目

  • Swift(Swift) 中的 三目 运算保持了和 OC 一致的风骨
  • 提醒:以下代码,可以按 cmd + shift + y,打开控制台,查看输出结果

num > 10 ? print("大 \(num)") : print("小 \(num)")

或者

num > 10 ? print("大 \(num)")  : () 
这样就对后面的不作处理。
() 表示空执行。

图片 3

switch

  • switch 不再局限于整数
  • switch 可以本着任意数据类型进行判定
  • 每一个 case 前面总得有可以推行的言辞
  • 不再强制需要 break
  • 虽然没有其余需要履行的话语,可以应用 break
    要确保拍卖所有可能的状况,不然编译器间接报错,不处理的尺码可以置身
    default 分支中
  • 每一个 case 中定义的变量仅在现阶段 case 中行之有效,而 OC 中需要动用 {}
  • 多值 case 可以应用 , 分隔

let scoreString = "优"

switch scoreString {
case "优":
    let name = "学生"
    print(name + "80~100分")
case "良", "中": print("60~80分")
case "差": print("不及格")
default: break
}

switch 的准绳判断

  • switch 中可以运用 where 子句判断标准
  • 假诺只做规范判断,case 部分可以采纳 _ 省略
  • 唤醒:Swift 中可以使用 _ 忽略任何不吝惜的始末

let score = 90
switch score {
case _ where score >= 80: print("优")
case _ where score >= 70: print("良")
case _ where score >= 60: print("中")
default: print("差")
}

踏身小眸园,仿佛穿越时空,清末民初住宅风格,西洋古董家具,还有许多长时间已失传的民国时期消费品,俨然一座小型博物馆。

for

  • swift撤除了i++和++i和价值观的for循环

for i in 0...5 {

}

for i in 0..<5 {

}
  • 反序遍历

 for i in (0..<10).reversed() {

}

图片 4

三、可选项(Optional)

春日是小眸园最美的时候,鱼儿在开着睡莲的水缸里游弋,鸟儿发出清脆的喊叫声,小钻井会喷出水柱来灌溉朵朵茉莉(Molly)。

简要

(1)定义变量时,倘诺是可选的,表示可以有值,也可以是nil,用“?”
(2)强行解包 “!”,程序员来专注!,并且要少用,可能会崩
(3)最常见的失实:解包的时候发现nil。fatal error: unexpectedly found
nil while unwrapping an Optional value
(4)let可选的话,没有默认值,需要赋值。var可选的话,默认值为nil
(5)可选项在参臆度算时候必须解包

图片 5

概念

  • Optional 是 斯维夫特(Swift) 的一大特点,也是 斯维夫特(Swift)(Swift) 初学者最容易困惑的问题
  • 概念变量时,在品种前边添加一个 ?,表示该变量是可选的
  • 概念变量时,如果指定是可选的,表示该变量:
  • 可以有一个点名项目标值
  • 也得以是 nil

此间的主妇好清静,喜独居,却做着一件需要通常与人打交道的立身:开旅社。

定义

  • 格式1(自动推导):var 变量名: Optional = 值
  • 格式2(泛型):var 变量名:Optional<类型> = 值
  • 格式3(简化格式):var 变量名: 类型? = 值

// 格式1
let x: Optional = 20
// 格式2
let y: Optional<Int> = 30
// 格式3
let z: Int? = 10

print(x)
print(y)
print(z)

天天深夜,她早起为别人准备用膳:清粥、苏式点心、小菜、水果,摆盘都要很美。客人从天南地北而来,有的来去匆匆,客套不了几句话,情谊和礼貌就完全反映在一份精美的早餐里了。

默认值

  • 变量可采用的默认值是 nil
  • 常量可选用没有默认值,需要在概念时,或者构造函数中赋值

var x1: Int?
print(x1)

let x2: Int?
// 常量可选项没有默认值,在赋值之前不能使用
// print(x2)
x2 = 100
print(x2)

图片 6

计量和粗暴解包

  • 可选值在参推测算前,必须解包 unwarping
  • 只有解包(unwrap)后才能参臆度算
  • 在可挑选后添加一个 !,表示强行解包
  • 假设有值,会取值,然后涉足后续总计
  • 倘诺为 nil,强行解包会导致崩溃

print(x! + y! + z!)

程序员要对每一个 ! 负责

小眸园只有四个房间,每个房间都有温馨的个性:清雅的静寂里,高贵的凤来仪,妩媚的海上花,动人的秋月白,高傲的鸿鸾禧,温柔的小团圆,神秘的夜未央,秀气的一月天……于她,就类似六个初成长的儿女,须得静心照料,才可获释光芒。

可选解包

  • 假使只是调用可拔取的函数,而不需要参估算算,可以动用可选解包
  • 在可选拔后,使用 ? 然后再调用函数
  • 应用可选解包可以:
  • 假定有值,会取值,然后实施后续函数
  • 如若为 nil,不会履行另外函数

var optionValue: Int?
print(optionValue?.description)
// 输出 nil

optionValue = 10
print(optionValue?.description)
// 输出 Optional("10")

与野蛮解包比较,可选解包更安全,可是只可以用于函数调用,而不可能用来统计

图片 7

旅馆房间

可采用判断

小团圆

不野蛮解包的点子

出于可挑选的值可能为
nil,不容许直接出席运算,由此在实际支付中,日常需要判定可挑选是否有值。

假定仅仅运用
if,会让代码嵌套层次很深,不宜阅读和体贴,为精通决这一题目,苹果提供了以下两种办法:

  • ??
  • if let / var
  • guard let / var

图片 8

??

  • ?? 运算符可以用于判断可挑选是否为 nil,假使是则使用前面的值替代

小心:?? 的先行级低,在拔取时,应该专注使用 ()

let x: Int? = 10
let y: Int? = 100

print((x ?? 0) + (y ?? 0))

小眸园自开园来说,造访的情侣络绎不绝。常有人问,房间取名小团圆有何特别意义?

if let / var

  • 应用 if let,一旦进入 if 分支,表示可挑选一定有值
  • 常量/变量的效率域仅在 {} 内部
  • 动用 , 可以判明六个可拔取是否有值
  • 使用同名常量/变量,防止重新起名的苦闷
  • 一旦要在分层逻辑中修改值,可以选择 var,通常使用 let

let name: String? = "Mike"
let age: Int? = 18

if let name = name,
    let age = age {
    print("\(name) 今年 \(age) 岁")
} else {
    print("姓名或者年龄为 nil")
}

《小团圆》是张爱玲一部未成功的长篇散文,女主人喜欢民国风,大约是从张爱玲起头。而书中九莉的阅历大多是张爱玲在形容自己。房间起名小团圆,大概是想续未竟之梦。

guard let / var

  • guard 是与 if let 相反的语法,Swift(Swift) 2.0 推出
  • guard 同样可以看清可挑选是否有值
  • 多值判断使用 , 分隔
  • 比方发现 nil,在 else 分支重回
  • 支行停止后,所有的 常量/变量 都有值
  • 相比较 if let,guard 语法的支行社团能省掉一层
  • 假设要在此起彼伏逻辑中修改值,可以应用 var,平常使用 let

func demo(name: String?, age: Int?) {

    guard let name = name,
        let age = age else {
            print("姓名或者年龄为 nil")

            return
    }

    print("\(name) 今年 \(age) 岁")
}

demo(name: name, age: age)

图片 9

guard let和if let可以用同名变量接收。

因为总会取名字,if let name =
name这样就足以,注意前面使用的时候用非空的可怜!并且iflet和guardlet可以依次判断,先判断是一个字典,再拿字典的数组,在认清数组的值,可以一条线判断出来。
图片 10

▲品相完全的梳妆台,透出阵阵木香。

四、字符串

用String,是一个结构体,具有绝大多数NSString效用,匡助直接遍历

(1)遍历:

func demo3() {

    // 字符串遍历(NSString不支持这么遍历)
    let str = "wowosnshi是"

    for s in str.characters {
        print(s)
    }
}

(2)长度:

// 返回指定编码对应的字节数,每个汉字三个字节
print(str.lengthOfBytes(using: .utf8))

// 返回真正字符串长度
print(str.characters.count)

(3)拼接:要小心可选项拼接不解决会带上Optional,剩下的都可以凑合,再也不用看StringWithFormat了

let name = "AA"

let age = 19

let title : String? = "sss"

print("\(name)\(age)\(title ?? "")")

(4)格式化:

  • 格式化成日期

let h = 8 , m = 10, s = 44

// OC中用stringWithFormat格式化日期,Swift中可以

let strDate = String(format: "%02d-%02d-%02d", h,m,s)

print(strDate)

(5)截取字符串:提议用NSStrin作中转,因为swift取串方法一贯在改变

  • NSString方法

let str = "红红火火恍恍惚惚"

let strOC = str as NSString

strOC .substring(to: 1)

strOC.substring(with: NSMakeRange(0, 2))

图片 11

五、数组

(1)就是中括号,注意数组的项目,并且基本数据类型不需要包装,可以直接方数组里,假设类型不同等(混合数组,不过基本不用),自动推导[NSObject]。在斯维夫特(Swift)(Swift)中还有一个[AnyObject类型],标示任意对象,因为在Swift(Swift)中一个类可以没有此外父类。

(2)遍历:

    // 遍历1(按照下标遍历)
    for i in 0..<array.count {


    }

    // 遍历2(遍历元素)
    for s in array {


    }

    // 遍历3(同时遍历下标和元素)
    for e in array.enumerated() {

        // let e: (offset: Int, element: String) e是一个元组        
        print("\(e.offset), \(e.element)")

    }

    // 遍历4(同时遍历下标和元素)
    for (n,s) in array.enumerated() {

        print("\(n),\(s)")

    }

    // 反序遍历
    for s in array.reversed() {


    }

    // 反序索引下标(这样写才对,先枚举再反序)
    for (n,s) in array.enumerated().reversed() {


    }

(3)增删改:

    array.append("AA")

    array[1] = "BBB"

    array.remove(at: 2)

(4)合并:用“+”号。不过要合并的数组的四个项目必须一致。

秋月白

六、字典

一般是[String:NSObject],对应键值对.由于3.0后多数都是结构体了,AnyObject不佳用了,Any范围更大
(1)字典数组:
(2)增删改:和数组都接近,就是五个字典合并不像数组直接相加,而是需要遍历

图片 12

七、函数

(1)外部参数,当外部参数用_代表的时候,会在表面调用的时候忽略形参名
图片 13

(2)函数的默认值(OC不持有),这些使斯威夫特比OC灵活很多居多,一个主意能够做过多事,因为OC会有各类参数和整合,斯威夫特(Swift)只需写一个最多的参数,然后不需要的设定默认值就是了

图片 14

(3)无重返值 :直接省略 () Void都足以

(4)闭包:类似Block,比Block还广泛。OC中Block是匿名函数,斯威夫特(Swift)中函数是独特的闭包。闭包在全部开发中和Block的利用场景同样。用于控制器/自定义视图/异步执行到位的回调。这么些回调的特性就是都是以参数回调处理结果,重返值为Void。

  • 定义:

       let biBao = { (x: Int) -> Int in
                
           return x + 100
       }
            
       print(biBao(10))
    
  • GCD:将任务添加到行列,指定执行任务的函数。任务就是Block/闭包,队列以协同/异步的措施履行。

 func loadData(compeletion:@escaping ( _ result: [String])->()) -> Void {                  DispatchQueue.global().async {                          print("耗时操作会获得一些结果 \(Thread.current)")                          Thread.sleep(forTimeInterval: 1.0)                          let json = ["天气","不错","刮大风"]                          // 主线程回调             DispatchQueue.main.async(execute: {                                  print("主线程更新UI \(Thread.current)")                                  // 回调 -> 通过参数传递 执行闭包                 compeletion(json)             })         }         }

调用:

        // 执行的适合我就拿到了值
        loadData { (result) in
            
            print("获取的新闻数据 \(result)")
        }
  • 随行闭包:倘使函数的最终一个参数是闭包,那么参数就概括了,最后一个参数直接{}大括号包装

  • 闭包的巡回引用:

图片 15
        

图片 16

(5)面向对象(各个构造函数):()就是allocInit,在Swift(Swift)中对应init()。在swift中一个档次所有类都是共享的,可以一向访问,每一个类都默认有一个命名空间。A.name
B.name God.name
Dog.name。同一个类可以从属于不同的命名空间(倘使有一个框架有Person类,做用户,还有一个框架做后台,也用Person。在OC中就只可以靠前缀解决,HouTaiPerson,KuangJiaPerson。而斯威夫特(Swift)中的命名空间就是项目名。AAA项目有一个Person,那么AAA.Person就是AAA的Person类,此时再导入框架,这也是框架的.Person)
图片 17
 

  • 在自定义的Nsobjiect类中,has no
    initalizers 标示没有开端化器,开首化器可以有三个,默认是init。当以此类有总体性的时候,属性要分配内存空间,就是说要有起首值。那么实际上就是先给自己的特性分配,然后给父初阶。其实这样一看,斯维夫特(Swift)和OC是相反的!

图片 18

思路:OC是先调用四叔。就是Person,Person会再调用NSObject,就是先跑上去什么都不管,先先河化了NSObject,然后才往下走挨个伊始化。斯维夫特(Swift)是把温馨全然起首化,再上去初阶化岳丈,这么看比OC快了一圈,性能要好。

图片 19

  • 重载构造函数:(重写是父类有其一措施,override。重载是函数名相同,参数和个数不同。init就重写,init+参数就重载。OC是绝非重载的!都是initWithXXXXX)。重载其实是最基本的方法,OC没有实际很low,不过斯威夫特(Swift)(Swift)有。

图片 20
瞩目:要是重载了构造函数并且没有落实父类的init,那么系统不再提供init构造函数了(默认是局部),因为默认的构造函数不可能给本类的特性分配空间(你不和谐写name = ,系统就没办法分配)
 

  • KVC构造函数:只需记住下面4点
    图片 21
    因此一般在模型中加个? 然后用KVC实现(先调用init因为是运作时机制)

  • 模型中属性定义:基本数据类型 = 0,对象设置?
    运转时中,基本项目设置?   
    属性设置个人都会让运行时拿不到,此时kvc就会出错。
    图片 22

  • 假设子类没有重写父类方法,调用的时候就会直接调用父类的办法。当继承一个类,就卫冕所有属性和艺术,包括KVC。当PERSON写好了KVC后,
  • 整体
    图片 23
    (6)便利构造函数:关键字Convenience(开发用的很少,因为模型都是框架转,UI不需要便民)
    *目标:条件判断,只有满意条件才实例化对象,避免不必要的内存开销,简化对象创制。本身是不负责属性的创导和起初化的。
     
    图片 24

 
  
(7)deinit:类似OC的Dealloc
图片 25

“东船西舫悄无言,唯见江心秋月白”。

八、分类:extension

福利构造函数 + 分类可以简简单单抽取很多代码。例如给UITextField/UIButton写分类,然后写便利构造函数,方便。

江面上的画舫和游艇都安静的,只见江基本倒映的秋月泛着白光,所有人都在注意聆听琵琶女的弹奏。

九、Swift的类,结构体,枚举二种都有构造函数,都可以有措施,就像OC的类

这是一个长久的卧榻,在原先,它是姑娘未出阁时的闺床,只有1.35米宽,1.8米长,显著已不适合现代人。女主人将它改造成床榻,榻上安放茶几与灯盏,可饮茶,可清谈。

十、其它

图片 26

懒加载:

在OC开发中,懒加载一般自定义控件。在Swift(Swift)中,懒加载仍然需要用的,可以保证控件延迟创立,仍是可以避免处理控件解包。即使直接定义控件var
label =
UILabel,依据代码从上到下,会让控件在ViewDidLad此前就提前创立了。所以需要懒加载。OC中懒加载就是Get方法,Swift间接lazy var。当然也足以private lazy var来界定成效域。

(1)简单的懒加载:
图片 27

(2)完整的懒加载:()就是函数执行,就是一个破例的闭包,所以懒加载本质是一个闭包。一般不这么写。
图片 28
  
(3)OC和Swift区别

  • OC:

- (UILabel *)label{
    //如果label等于nil就会创建!
    if (_label == nil) {
        _label = [[UILabel alloc]init];
        _label.text = @"loirou";
        [_label sizeToFit];
        _label.center = self.view.center;
    }
    return _label;
}

OC是卓殊nil时候就懒加载

    [self.view addSubview:self.label];
    //释放label
    _label = nil;

    //会再次调用懒加载的代码
    NSLog(@"%@",self.label);

当label设nil的时候就在此调用。在ios6中,didReceiveMemoryWarning是不清理视图的。
 
 

  • Swift:

图片 29
这儿释放的时候就会报错。因为定义的时候从不?,就是大势所趋有值得。
这就是说一旦定义时候加? 一旦label = nil,也不会在履行懒加载了!因为懒加载根本没写倘虽然空就创设。
懒加载只会在率先次调用的时候实施闭包。斯威夫特(Swift)中势必注意不要主动清理视图或控件,因为懒加载不会创制了(例如内存警告别干掉控件,干掉了在也用不成了,因为懒加载就五回)

内卧的梳妆台上,摆放着一盏民国时期的老台灯,还有一只青花瓷瓶。梳妆台的镜面可以合上,设计精巧。

统计型属性(只读):

(1)getter/setter(开发不用):
 

    // 开发一般不用,还给搞一个_name。
    // swift一般不会重写getter和setter
    private var _name: String? // 假装的一个值
    var name: String? { get{return _name}  set{_name = newValue}} // get返回成员变量 set记录成员变量

    override func viewDidLoad() {
        super.viewDidLoad()

        demo()
    }

}

(2)总括型属性:readOnly只读:OC中重写get。斯威夫特(Swift)(Swift)也是重写get,不管set就可以。
 

  // 只读,此时set赋值时候就会报错
   var name: String? { get{return "ABC"}}
  // 还有一种简写:
   var name: String? { return "ABC"}

看这类属性,是自我不保留内容的,都是经过测算得到结果。就可以当自身就是个从未参数只有再次来到值的函数!!我老是return值给你本身的职责就完成了。每便你调用我这些特性的时候,我都会开展几次总括!都会实施我的代码然后return给你。我本人不存储的。
 
(3)懒加载和统计型属性的区别:
图片 30

(4)存储型属性:需要开辟空间,存储数据。一般的习性都是存储型属性(懒加载)

(5)存储和计量都足以?或者不加。看境况是不是必选

(四)斯威夫特中安装模型数据:
Swift做好模型后。其它控件拿到模型后,由视图自己来展现。此时在didSet里写。就是顶替OC的Setter方法。(OC的Setter要考虑_成员变量 = 值,而且要是是copy需要.copy,而斯威夫特(Swift)(Swift)不需要考虑任何)

图片 31

取名空间:

  • 在同一个上空(项目),全局共享。用第三方时,如若从来拖拽,这就从属于一个空中,很有可能争辨,所以用Cocopod
  • 动态得到命名空间(从info.plist加载),命名空间和项目名称有提到。info的Bundle name其实就是命名空间(一般写的很奇怪 #(ProdectNmae))。
    打印info
    print(Bundle.main.infoDictionary)
     图片 32

赋值

// 获取命名空间的值,可选 let str = 
Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""                  
let con = NSClassFromString(str + "." + "ViewController") as? UIViewController.Type

水晶灯照射下的西洋古董大边柜,显示出民国老宅独有的贵气。

反射机制:

对于任何类都得以知道类的所有属性和措施,对于此外对象都得以调用任何性质和形式,这种动态获取的信息和动态调用对象属性方法的效率成java的反射机制(斯维夫特(Swift)也有了)

(1)在OC中运用反射机制

  • 利用NSClassFromString措施来采用字符串获取类
  • 利用isMemberOfClass判定是否是某一个类
  • 利用isKindOfClass判断是否是某一个类的子类
  • 利用conformsToProtocol认清目的是否遵守某一个共谋
  • 利用respondsToSelector认清是否落实了某一个措施
  • 利用performSelector或者objc_msgSend直接调用方法

(2)在斯威夫特(Swift)中使用反射机制仿佛。工作中用的成千上万众多。
情景:AppDelegate(OC中也用过,利用NSClassFromString得到类,然后设置根控制器。可是斯维夫特(Swift)中多了一个命名空间写法。)
 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow(frame: UIScreen.main.bounds)

    // 依据String名字拿到控制器(添加项目名称,命名空间,不能有数字和特殊符号)
    // 返回的是AnyClass? 需要as?强转
    // 控制器添加Type类型
    let rootControl = NSClassFromString("SwiftyDemo.ViewController") as? UIViewController.Type

    let vc = rootControl?.init()

    window?.rootViewController = vc

    window?.makeKeyAndVisible()

    return true
}

 
(3)第三方框架,用了重重反光机制和工厂方法,为了实现大气的解耦和打包,很麻烦。一个办法恐怕跳10个章程10个控制器才写了一个加法。可是倘使涉嫌高级开发和打包,必须要由此这一步。

图片 33

推开花窗,外面是庭院深深。在江南小雨的生活里,瓦檐上滴落的雨点敲打在美丽的女生蕉上,淅淅沥沥的,这是老巴尔的摩的味道。

图片 34

幽篁里

图片 35

“独坐幽篁里,弹琴复长啸。

深林人不知,明月来相照。”

古人王维在寂静的竹林里,兀自弹一曲古琴,只需明月相伴。

屋子挂起绿丝绒窗帘、竹帘帷幔,耳边听到风吹竹叶的沙沙声,只觉林中幽幽,云深不知处。

图片 36

主卧里多少个欧式古董边柜、一个狂胜海派梳妆台,从里屋走出,穿过幽长走廊,便可赶到鎏金床榻,颇有年代。

图片 37

海上花

图片 38

“睡梦成真,转身浪影汹涌没红尘,残留水纹空留遗恨,愿只愿她生,今日的人影能相随。永生永世不离分……”

十九世纪未的新加坡英租界里,有一所名为“长三公寓”的高级妓院。五个红倌人在酒席里觥筹交错,又在兜转中看破红尘。后来她们被侯孝贤拍进电影,就叫《海上花》。

女主人非凡喜爱清末民初的家电摆设,当时西洋家具刚先河在中华盛行,中西合璧的作风令人记忆犹新。

图片 39

家电雕花细腻,透出阵阵木香,虽长时间,但仍旧保存完好。

图片 40

▲闲来喝茶休憩,亦可抄写经文。

图片 41

▲房间被红丝绒隔成前后两间

图片 42

▲民国时期的伶人画像

海上花开,海上花落,伶人尤在,客官已不知去向。

一阵寒风楞中醒,恰好一杯清茶饮。中堂点起一炉沉香屑,给你减缓道来一段出自民国的旧事,有点哀怨有点美好,只要你想听。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图