swift基本语法

常量变量

// 定义变量
var i = 10
print(i)
i = 15
print(i)

let j = 20
// 常量一经定义不能自改数值
//        j = 25
print(j)
  • 阶段性小结
    var 定义变量,设置之后可以修改
    let 定义常量,设置之后不可以修改
    语句末尾不用使用 ;
    在 Swift 中使用 print() 替代 OC 中的 NSLog
    print 的性能更好,后面会演示

  • 定义 OC 对象

// 实例化视图
let v = UIView(frame: CGRectMake(0, 0, 100, 100))
// 设置背景颜色
v.backgroundColor = UIColor.redColor()

// 添加到根视图
view.addSubview(v)
  • 阶段性小结

    • 在 Swift 中要实例化一个对象可以使用 类名() 的格式,与 OC 中的 alloc/init 等价
    • OC 中的 initWithXXX 在 Swift 中通常可以使用 类名(XXX: ) 找到对应的函数
    • OC 中的 [UIColor redColor] 类方法,在 Swift 中通常可以使用 类名.XXX 找到对应的函数
    • 使用 let 修饰 v 并且赋值,表示 该常量的内存地址不允许修改,但是可以修改其内部的属性
    • 当前对象的属性,不需要使用 self.
    • 常量&变量的使用原则:尽量先用 let,只有需要变的时候,再用 var,能够更加安全
  • 常量类型

let x = 10
let y = 10.5
let z: Double = 20

print(Double(x) + y)
print(x + Int(y))
print(y + z)
  • 阶段性小结
    • 初次接触 Swift 中会因为简单的 var let 误以为 Swift 中的类型非常松散
    • 其实所有变量的准确类型都是在赋值的同时自动推导的
    • Swift 是对类型要求非常严格的一门语言,一个值永远不会被自动转换成其他类型
    • 如果要转换,必须显示转换,Swift 中
    • 小数默认是 Double 类型
    • 整数默认是 Int 类型
    • 如果要显式的指定变量的类型,可以在定义是使用 var 变量名: 类型 = 值

循环

  • OC风格的for
// 传统写法
for var i = 0; i < 10; i++ {
    print(i)
}
  • Swift风格的 for
// 遍历 0 ~ <10
for i in 0..<10 {
    print(i)
}

print("---")

// 遍历 0 ~ 10
for i in 0...10 {
    print(i)
}
  • 阶段性小结
    • Swift 中使用 in 关键字标示循环的范围
    • 0..<10 表示从0到9
    • 0...10 表示从0到10
    • 注意之间不能出现空格
  • 特殊写法
for _ in 0...10 {
    print("hello")
}
  • 阶段性小结
    • 如果不关心循环本身的索引,可以使用 _ 忽略
    • 这一技巧在之前的分支演练中出现过

数组

  • 创建简单数组
let arr = ["zhangsan", "lisi"]
print(arr)
// 遍历每一个元素
for a in arr {
    print(a)
}
// 像 OC 一样打印
print(arr as NSArray)
  • 数组中保存的对象类型
// 数组中保存的都是字符串
let arr = ["zhangsan", "lisi"]
// 数组中保存的是 NSObject
let arr1 = ["zhangsan", 1]
  • 阶段性小结

    • 数组使用 [] 定义,这一点与 OC 相同
    • 如果初始化时,所有内容类型一致,择数组中保存的是该类型的内容
    • 如果初始化时,所有内容类型不一致,择数组中保存的是 NSObject
  • 常见数组操作

// 定义只能保存字符串类型数组
var array: [String]

// 初始化数组
array = ["zhangsan"]

// 添加元素
array.append("lisi")

print(array)

// 删除元素
array.removeAtIndex(1)
print(array)

// 删除所有元素
array.removeAll(keepCapacity: true)
print(array.capacity)

// 注意数组容量的变化
for i in 0..<10 {
    array.append("\(i)")
    print("\(array) --- \(array.capacity)")
}

// 实例化新的数组
var array2 = [String]()
array2.append("1")
array2.append("2")

// 拼接数组
array += array2

print(array)
  • 阶段性小结
    • 如果定义数组时指定了保存对象的类型,择不能向数组中添加其 他类型的内容
    • 可以使用 String
    • let 定义的数组是不可变的
    • var 定义的数组是可变的

字典

/// 定义并实例化字典
var dict = [String: AnyObject]()

dict["name"] = "zhangsan"
dict["age"] = 18

print(dict)

// 设置相同 key,之前的数值会被覆盖
dict["name"] = "lisi"
print(dict)

// 删除某一个 key
dict.removeValueForKey("age")
print(dict)

dict["title"] = "manager"
print(dict)

// 遍历字典(k, v可以随便写)
for (k, v) in dict {
    print("\(k) -- \(v)")
}

// 合并字典
var dict2 = ["name": "wangwu", "age": 80, "title": "boss"]
for (k, v) in dict2 {
    dict.updateValue(v, forKey: k)
}
print(dict)

字符串

  • 在 Swift 中绝大多数的情况下,推荐使用 String 类型
  • 使用 String 的原因
    • String 是一个结构体,性能更高
    • String 目前具有了绝大多数 NSString 的功能
    • String 支持直接遍历
    • NSString 是一个 OC 对象,性能略差
    • Swift 提供了 String 和 NSString 之间的无缝转换
  • 遍历字符串
let str = "我要飞的更High"

for s in str {
    print(s)
}
  • 字符串拼接
let str1 = "zhangsan"
let str2 = "lisi"
let i = 10

print(str1 + str2)
print("\(str1) \(str2) \(i)")
  • 阶段性小结
    直接在 "" 中使用 (变量名) 的方式可以快速拼接字符串
    小伙伴们再也不要考虑 stringWithFormat 了
    格式化字符串
for _ in 0...10 {
    let str = String(format: "zhangsan - %04d", arguments: [arc4random_uniform(100)])
    print(str)
}
  • 阶段性小结

    • 在实际开发中,如果需要指定字符串格式,可以使用 String(format:...) 的方式
    • 注意:后面的参数需要放在一个数组中
    • String & Range 的结合
  • 以下是超级费劲的代码

let str: String = "我要飞的更High"

var subStr = str.substringWithRange(Range<String.Index>(start: str.startIndex, end: str.endIndex))
print(subStr)
  • 建议写法
let str1: NSString = "我要飞的更High"
print(str1.substringWithRange(NSMakeRange(0, 3)))

函数

  • 简单演练
func sum(a: Int, b: Int) -> Int {
    return a + b
}
  • 阶段性小结

    • 函数定义格式:func 函数名(参数: 参数类型...) -> 返回值 { // 代码实现 }
    • 如果没有返回值, -> 返回值 可以省略
    • -> 是一个很有意思的符号
    • 默认情况下,在调用函数时,第一个参数名是省略的
    • 参数名的特殊处理
  • 强制要求参数名

func sum1(x a: Int, y b: Int) -> Int {
    return a + b
}
  • 省略参数名
func sum2(a: Int, _ b: Int) -> Int {
    return a + b
}

闭包

  • 闭包定义
  • 闭包简化 - 尾随闭包
  • 闭包参数
  • 闭包返回值
  • 闭包的循环引用
  • 闭包类似c的block,就是一种特殊的数据类型
weak var weakSelf = self
demo("zhangsan") { (_) -> Int in
    print(weakSelf?.view.backgroundColor)

    return 20
}
  • 闭包表达式优化,
  • 1.类型优化, 由于函数中已经声明了闭包参数的类型, 所以传入的实参可以不用写类型
  • 2.返回值优化, 同理由于函数中已经声明了闭包的返回值类型,所以传入的实参可以不用写类型
  • 3.参数优化, swift可以使用$索引的方式来访问闭包的参数, 默认从0开始
bubbleSort(&arr){
//    (a , b) -> Int in
//    (a , b) in
    if $0 > $1{
        return 1;
    }else if $0 < $1
    {
        return -1;
    }else
    {
        return 0;
    }
}


// 如果只有一条语句可以省略return
let hehe = {
    "我是lnj"
}
print(hehe())

懒加载

lazy var demoView: UIView = {

    let v = UIView(frame: CGRectMake(10, 10, 100, 100))
    v.backgroundColor = UIColor.redColor()

    return v
}()
  • 格式:
    lazy var 变量: 类型 = { 创建变量代码 }()
  • 懒加载的写法本质上是定义并执行一个闭包

getter & setter

  • 自定义 Person 类
class Person: NSObject {

    var name: String?
    var age: Int?
}
getter & setter

var _name: String?

var name: String? {
    get {
        return _name
    }
    set {
        _name = newValue
    }
}
  • 在 Swift 中以上形式的 getter & setter 很少用didSet

  • 在 OC 中,我们通常希望在给某一个变量赋值之后,去做一些额外的操作

  • 最经典的应用就是在自定义 Cell 的时候,通过模型的设置方法完成 Cell 的填充

var length: Int? {
    didSet {
        timeStr = String(format: "%02d:%02d:%02d", arguments: [length! / 3600, (length! % 3600) / 60, length! % 60])
    }
}
var timeStr: String?
计算型属性

var title: String {
    get {
        return "Mr " + (name ?? "")
    }
}
  • 只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性
  • 计算型属性本身不占用内存空间
  • 不可以给计算型属性设置数值
  • 计算型属性可以使用以下代码简写
var title: String {
    return "Mr " + (name ?? "")
}

构造函数

init(dict: [NSObject: AnyObject]) {
    name = dict["name"] as? String
    age = dict["age"] as? Int
}

析构函数

deinit {
    print("88")
}

ATS 应用传输安全

App Transport Security (ATS) lets an app add a declaration to its Info.plist file that specifies the domains with which it needs secure communication. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one. 

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

推荐阅读更多精彩内容

  • 2010年7月,chirs Lattner 用一年的时间完成了swift的基本框架,于2014年6月分布, 取消了...
    张无忌_阅读 523评论 0 3
  • 常量&变量 什么是常量和变量 在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 使用l...
    去兜风喽阅读 566评论 0 0
  • YES 2014WWDC发布 常量和变量使用注意 在实际过程中,建议先定义常量,如果需要修改再改变为变量(更加安全...
    南冯阅读 546评论 0 0
  • 1.新建Xocode Swift 程序 2.(基本使用) 在Swift中没有.h 和.m文件 只有一个.Swift...
    圆小米123阅读 1,640评论 0 7
  • 我有个愿望,做文艺的自己,一直到头发花白。 有个高中同学,在微商刚盛行的那一年,辞去编辑工作转战微商,现在买了豪车...
    柴小影阅读 3,523评论 89 149