swift 那点小事(一)

swift是一门强语言,很多地方比OC写的要严谨的多。今天总结一下swift和OC的区别,以及一些融通易犯错的地方,希望对需要的人有所帮助

在swift中,没有main 函数的概念,没有.h 和 .m 文件,一个类,只用一个swift来表示;
可以不写分号,如果一行当中有多条语句的时候分号就必须写;
采用print函数来代替NSLog函数打印数据,而且苹果建议我们这样,print函数比NSLog效率高,在print函数里,没有占位符的概念,如果要插入参数采用 \ ()

 let a0 = 10
 print"a0 = \(a0)"
变量和常量

在swift中,变量和常量分别用var let 来表示,格式 : let/var 名字 = 初始值 , 不用明确指出变量和常量的类型,xCode 会根据你的初值自行推导出具体类型

let a0 = 10 // 常量一经赋值就不能改变
let a1 = 20.3625
var a2 = 22
a2 = 30 //变量可以改值
常用的数据类型

在OC中,一个整型int可以和一个浮点型的数进行相加,但在swift中不存在隐式转换,不同数据类型之间,不能做运算。做运算之前必须进行强制类型转换。格式: let/var 名字: 数据类型 = 初始值

let a1:Int = 21
var a2:Double = 123.23
print("a1 = \(a1),a2 = \(a2)")
let b1 = a1 + Int(a2) //如果是 a1 + a2,就会报错
let a3:Bool = true // 布尔值的两个值:true false
let a4:Character = "1"  // 字符类型采用character  并且双引号赋值
var a5:String = "hello world" // 在swift当中采用string表示一个字符串 ,双引号赋值,不是OC中得对象而是结构体
字符串及一些基本API
var str = "hello"
print("长度 = \(str.characters.count)")
// 拼接字符串采用 +=   拼接字符采用append 函数
var str1 = "world"
str += str1  //  = helloworld
let c:Character = "c"
str.append(c)   // = helleoc
if(str1 == "world") {    // 判断两个字符串是否相等 不用isEquealToString
    print("相等")
} 
if(str1.hasPrefix("wo")) {    // 前缀
    print("前缀是world")
}
if(str1.hasSuffix("ld")) {  
    print("后缀 ")
}
print("str1的大写\(str1.uppercaseString)")  // 转化为大写
let str2 = "2158JDOF"
print("str2的小写\(str2.lowercaseString)")  // 转化为小写

for item in str.characters{  // 字符串支持遍历
    print(item)
}
let str4 = str1 as NSString // swift 里面的字符串,跟OC里面的字符串可以互相转化
数组和字典 ,swift和OC语法不同,但很多API的调用接口还是差不多的

在swift 中,数组的类型是array ,创建一个数组或字典的时候,必须明确的指出,数组里面元素的类型 跟OC里面的数组NSArray 可以相互转换 用as

// 数组的可变不可变,取决于用let 还是var
var array1:[String] = ["12","34","56","78"]  //可变数组
let array2:[String] = ["12","34","56","78"]  // 不可变数组
array1.append("90")    // 增加元素 
array1 .removeAll(keepCapacity: true)// 移除所有的元素,但是内存大小保留
// 元组遍历  下标和值
for (index,value) in array1.enumerate() { 
    print("index = \(index),value = \(value)")
}
// 字典 Dictionary
var dic:[String : AnyObject] = ["1":"a","2":"b"]
var dic1:[String : AnyObject] = ["3":"a","4":"b"]
// 增加 和 更新.如果key存在就是一个更新的操作,如果不存在就是添加的操作
dic["3"] = "c"
dic.removeAtIndex(dic.indexForKey("3")!) //删除指定下标
dic.removeValueForKey("1")
// 元组遍历
for (key,value) in dic .enumerate(){
    print(key,value)
}
// 获取所有的key dic.keys  获取所有的value  dic.values
// 合并两个字典
for item in dic.keys {
    dic1[item] = dic[item]
}
可选类型

如果一个值可能有值,也可能为nil 那么这个变量或者常量就是可选类型 可选类型用? 标识出来,打印数据包含Optional字样

var a1:Int? = 22

?? 空运算标识符 如果可选类型值不为空的话,会帮我们进行强制解包之后参与运算,如果可选类型为空,则提供一个默认值给我们参与运算

var value:Int? = 10
let value1 = (value ?? 5) + 20  // 结果为30
var value2:Int?
let value3 = (value2 ?? 5) + 20  // 结果为25
let b1 = 10
let c1 = a1! + b1  // 可选类型不能直接参与运算,参与运算之前,必须强行解包,强制解包用!标识

警告,在对一个可选类型进行强制解包之前必须确认这个可选类型不能为nil 否则会报错 unexpectedly found nil while unwrapping an Optional value
在模型(KVC)里面,所有的基本数据类型,不可以为可选类型,否则的话,在字典转模型的时候(setValuesForKeysWithDictionary)找不到这个key
解决的方法是:给默认值0 let age:Int = 0

枚举

swift 一个枚举成员不局限于关联整型数据,也没有默认值,

enum Month:String{  // 如果枚举关联的是一个整形的话,第一个赋值了之后,后面的枚举值会自动累加。如果是非整形的话,就必须给每一个枚举赋值
// case January,case February, case match     // 两种赋值方式
    case January = "一月"
    case February = "二月"
    case Match = "三月"
}
var month = Month.January
month = .Match //如果一个枚举类型已经制定的话,下次赋值的时候可以通过.这种方式进行再次赋值,省略前面的类型
print(month.hashValue)// 哈希值,就是在枚举里的小标
print(month.rawValue)// 获取枚举成员的默认值,rawValue
控制流
  1. if后面的小括号可以省略,大括号不可以省略,swift 中后面的条件语句,没有“非0即真”得概念
    2 可选类型的判断用 if-let,先判断可选类型是否为空,不为空的话,创建一个局部的常量来接受此时这个可选类型的值,再执行代码块,为空,则不执行代码块
let a1:Int? = 10
if let b = a1 {
    print("b = \(b)")
}
// if-let-where    where 是对定义出来的常量再做一层判断
if let c = a1 where c > 5{
    print("a > 5")
}
// guard 守护  是判断可选类型是否有值,没有值的话执行else里面的代码块,有值的话,执行else 后面的代码块
func demo() {
    let a2:Int? = 10
    guard let d = a2 else {
        print("a = nil")
        return
    }
    print("a != nil = \(d)")
}
demo()

switch 后面的小括号可以省略, case 后面的break 可以不写,不会造成传统的效果。默认default必须添加 而且只能添加在最后面。case 后面必须有一条执行语句,而且如果有多条语句,case后面的大括号可以省略。switch 不再像OC那样,值局限于整型的选择

let a = 10
switch a {
case 3:
    print("a == 3")
case 10:
    print("a == 10")
default:
    print("a == nil")
}
let score = "优"
switch score{
case"优":
    print("")
case"良":
    print("")
default:
    print("")
}
循环 for while

for 后面的小括号不能写,大括号必须加上,在swift2.2之后废弃了

// 写法1
for var i = 0;i < 10;i++ {
    print("i = \(i)")
}
//写法2
for i in 0...10 {    // [0,10]闭区间
    print(i)
}
for i in 0..<10 {//   [0,10)左闭右开 
    print(i)
}

// while 循环

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

推荐阅读更多精彩内容