swift-基础-基本语法1

  • 创建对象: '
    • OC: alloc / initWithXXX
    • Swift: (XXX:)
  • 调方法
    • OC [UIColor redColor];
    • Swift: UIColor.redColor()
  • 枚举:
    • OC: UIButtonTypeContactAdd
    • Swift: UIButtonType.ContactAdd
  • 创建结构体:
    • OC CGPointMake()
    • Swift : CGPoint()

常量和变量

  • 以前在OC中的数据类型首字母要大写,比如Int/Float
  • 常量用let,注意只能初始化一次
  • Swift中尽量推荐用let,只有需要修改变量的时候才用var
let num : Int
num = 33
let num2 : Int = 44
  • 变量用var
var value : Double
value = 22.3
var value2 : Double = 33.33
  • 自动类型推导:如果在定义的同时初始化,那么可以不用写数据类型,编译器会根据内容自动推导出当前的数据类型:var num = 22.3
  • 数据类型转换:必须手动显式转换.Swift中永远不会自动转换(强语言)。CGFloat和Double之间也必须转换
var n1 = 10.1
var n2 = 10
var sum = n1 + n2 // 这么写是错的,OC中会隐式转换,Swift中不会
var sum = n1 + Double(n2) // 必须这么写

分支

  • if:swift中可以省略if后面的圆括号。OC中如果大括号中只有一条语句,可以省略大括号,swift中不行
let num = 10
if num == 10
{
    print("num是10")
}
  • Swift中提供了真正的BOOL类型:true/false。if后面的条件表达式必须是true/false。用到这里,最直接的改变以前的if (num) {}这么写是错的了
  • switch:同样可以省略switch后面的圆括号。可以不用写break
  • switch在OC中想在case后面定义变量,必须加大括号,而swift中不需要
  • switch在OC中defult可以随便放在哪里,或者不用谢,swift中必须放在最后一条,而且大部分情况下必须写

三目运算符

  • 注意运算符之间需要有空格。大括号如果不换行,前面也要有空格
let num = 10
let res = (num == 10) ? 10 : 5

可选类型Optional ? !看到问号或者感叹号那么说明是可选类型

  • 含义:可以有值,也可以没有值。只有可选类型才可以赋值nil
  • alt+单击该变量,可以发现它的类型后面有个问号? 所以如果一个变量如果点开看没有问号,那么表示它一定有值
  • 如果打印这个类型,那么会在前面自动加个Optional
  • 如果不想要Optional,可以在变量后面加个!,代表告诉系统该变量一定有值,就不会加Optional(称为强制解包)注意如果对nil执行了强制解包,那么会引发运行时错误
let url = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
print(url)
print(url!)
let url1 = NSURL(string:"[http://www.520it.com/哈哈")](http://www.520it.com"))
print(url!)// 此处会崩,因为url1后面有中文,导致url1为nil,对nil强制解包会崩
  • 所以一般在强制解包前作个判断是否为空if url != nil

可选绑定

  • 每次强制解包前还要作判断,太麻烦,所以swift提供了可选绑定
  • 格式:
let url = NSURL(string:"[http://www.520it.com/哈哈")](http://www.520it.com"))
if url2 = url{    print(url2) // 这里不会打印,因为url为nil,上面的if会过滤掉
}
let url3 = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
if url4 = url{    print(url2) // 这里会打印,而且不带Optional,系统会自动解包
}
  • 开发技巧:初学者不用去纠结问号感叹号

guard守护

  • 可先绑定写得多了,会导致判断太多(if套if)可读性差。用guard来解决这个问题:判断条件如果为假,那么执行大括号里的,否则继续往下走
  • 大多数情况用可选绑定,但是注意如果就算有空值,仍希望代码继续往下走的,要用可选绑定(if完了后面再跟if,不是嵌套)
guard 判断条件 else{
    return
}
  • 注意guard大括号里必须要有return或者continue
guard let url2 = url else{
    print("url2为空")
    return
}
// 能来到这里说明url2肯定有值
print(url2)

自动解包

  • 直接这么写会报错:因为数据类型不对,前面的变量url是NSURL?类型的
let url : NSURL = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
  • 必须这么写:
let url1 : NSURL? = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
let url2 : NSURL! = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
let url3 : NSURL = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))!
  • 如果数据类型后面带了感叹号了,那么在使用该变量时会自动解包。而问号则不会。比如上面打印url2和url3不会带Optional
  • 但是,注意变量后面别随便带感叹号,因为如果变量为nil,就会报错

??判断

  • 用于判断前面的可选类型的参数是否是nil,如果是nil就返回后面的值
        // 这里str是个可选类型
        let str: String? = nil
        // result不是可选类型(经过??判断之后,肯定有值)

        let result = str ?? "123"

        print(result)

断言

  • 用于判断某个变量是否为空,如果为空,那么直接程序崩溃并且打印信息
        assert(access_token != nil, "使用loadUserInfo()方法前必须先授权")

        assert(uid != nil, "使用loadUserInfo()方法前必须先授权")

        let params = ["access_token": access_token!,

                      "uid": uid!]

where

  • 相当于并且,写在可选绑定后面。在这里可以拿到本句代码中定义的常量。(用&&拿不到)
            if let sourceStr: NSString = status?.source where sourceStr != ""

            {

                let startIndex = sourceStr.rangeOfString(">").location + 1

                let length = sourceStr.rangeOfString("<", options: NSStringCompareOptions.BackwardsSearch).location - startIndex

                let rest = sourceStr.substringWithRange(NSMakeRange(startIndex, length))

                sourceLabel.text = "来自\(rest)"

            }

循环

  • 常规写法:可以省略圆括号。注意空格不要少
for var i = 0;i < 10;i ++ 
{
    print(i)
}
for item in ["1","2","3"]
{
    print(item)
}
  • swift特有写法:其中0..<10称之为半闭区间。
    • 半闭区间:不包含头,包含尾
    • 闭区间:0...10包含头尾
    • 注意...之间不能有空格
for i in 0..<10 // 倒过来就是从后往前遍历
{
    print(i)
}
  • while:Swift中很少用while循环
var index = 0
while index < 10
{
    print(index)
    index ++
}
  • do while -->repeat while

数组

  • let代表不可变数组,var代表可变数组
  • 前面不需要加@,会自动把基本数据类型转换成对象,不需要包装`var array = [10,"哈哈",9.9];
  • 定义:var array:[String]? // 定义一个内容为string类型的数组,并且没有初始化加个问号
  • 获取:print(array[1])
  • 修改:array[1] = @"呵呵"
  • 追加:array.append(33) 数组每次加内容,容量不够的话,每次会翻倍
  • 删除:array.removeAtIndex(0)// 这个删除方法会这个删除的元素返回给我们
    • 删除所有array.removeAll()
    • 删除所有但保存原有容量array.removeAll(keepCapacity:true).灵活使用可以节省性能
  • 合并:注意要相同类型才能合并
var array1 = [1,2,3]
var array2 = [4,5,6]
var array2 = ["4","5","6"]
array1 += array2 // 这样就完成了合并
  • 排序
// 让数组按照item的attribute属性来排序
array = array!.sort({ (item1, item2) -> Bool in

            return item1.attribute > item2.attribute

        })
  • 遍历:见上面for循环

字典

  • OC:@{key : value}
  • Swift:[key : value]
  • 同样,let和var代表不可变和可变字典
// 定义方法1:定义的同时赋值
let dict1 = ["name" : "lhj","age" : 29]
// 定义方法2:定义指明类型,再赋值
let dict2:[String:AnyObject]
dict2 = ["name" : "lhj","age" : 29]
  • 上面[String:AnyObject]类型是Swift中用的最多的字典类型,意思就是key是String类型的,value为任意对象
  • 获取:print(dict["name"])
    • 注意:取出来的都是可选类型的值,因为根据这个key取值可能会取不到,返回的值可能是nil
    • 可以在[]后面加个叹号,代表取出来的一定有值print(dict["name"]!)
  • 更新:dict["name"] = "zhangsan"
  • 添加:dict["weight"] = 100
  • 遍历
for key in dict.keys
{
    print(key)
}
// Swift特有方法,会将字典中的key赋值给for后面的括号中的第一个变量,将value赋值给第二个变量(括号中的变量称之为元祖)
for (k,v) in dict
{
    print(k)
    print(v)
}
  • 合并 :字典不能像数组那样+=来合并,只能遍历再一个个赋值。同样注意类型需一致
var dict1:[String:AnyObject] = ["name" : "lhj","age" : 29]
var dict2:[String:AnyObject] = ["score" : 99]
for (k,v) in dict1
{
    dict2[k] = v
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容