Swift 基本语法使用

1.新建Xocode Swift 程序


2.(基本使用)

在Swift中没有.h 和.m文件  只有一个.Swift文件  在Swift中不需要引入头文件


 swift的命名不能使用保留字和箭头/开头不能用数字,没有其它任何规定,甚至都可以使用小狗小猫命名.

print 的性能比NSLog要好用很多  而且他可以自动换行  很强大

//swift中 输出使用的print

//Switf中字符串不用加  @ 和分号 符号

print("Hellow Word !")

① let 和var 使用

1.1 let 定义常量,var 定义变量,let定义的必须在声明时指定初始值,普通的var声明也必须赋初始值

可以在一行同时声明多个常量或变量,用逗号隔开;如果每个常量对应一个var或let只需要用分号隔开即可.

每个常量和变量都一定会有固定的类型,如果没有指定类型,swift会根据后面的赋值类型来推断.

//这是变量a

var  a = 10;a = 20

//常量

let b = 10

//Switf 中我们的变量名可以使用表情或者中文来表示 再原来的OC中是不可以的

var 🐶 = 20

var 小明 = 30

//当我们的变量等于一个小数点的时候  他会自动给我们推到成Double 类型

var c = 99.0

let a:Int = 12;

var str = "hello"

1.2 Switf 中的类型

var a:Int = 100

var b:Float = 99.0

var c:String = "小二"

//Character为 字符类型  就是只有一个字符 和C语言中的char相似

var d:Character = "z"

1.3 字符串

var huangyu = "我是一只快乐的小鱼啊"

//在Switf中 BOOL值不再是YES 和NO 而是True 和false

var isTrue:Bool = true

//判断字符串是否为空

isTrue = huangyu.isEmpty

//Switf 中字符串可以看做字符串 的集合 那么怎么求字符串的长度???

//求字节的长度

huangyu.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)

//求字符串的长度

huangyu.characters.count

//在Switf中字符串的第二种写法,两种写法都代表空的 不同的写法

var 🐌 = ""

var abcd = String()

//拼接字符串

var a = "王伟"

var b = "xiaomi"

a + b + "123"

//在Switf中打印可以把对象或者变量直接写在括号里

print(a)

a == b  ///判断两个字符串是否相等

//交换两个字符串

var smile = "smile"

var cry = "cry"

swap(&smile, &cry)

smile

cry

var happy = smile

smile = cry

cry = happy

大小写转化

str.uppercaseString;//大写

str.lowercaseString;//小写

两个字符串相等 (==)

let string1 = "hello"字符串通过加法运算符(+)连接在一起:

let string2 = "you"

var welcome = string1 + string2 //值为hello you

也可以通过加法赋值运算符(+=)将一个添加到一个几经存在字符串变量上:

var string = "hai"

string += string2  //值为hai you

也可以用append方法将一个字符附加到一个字符串变量的尾部

let exclamationMark: Character = "!"

welcome.append(exclamationMark) //值为 hello you !

注意:

您可以用append方法将一个字符附加到一个字符串变量的尾部:

字符串插值

插入字符串面量的每一项都在以反斜线为前缀的圆括号中:

let a = 3

let b = "\(a) times 2.5 is \    (Double(a) * 2.5)"

// b 是 "3 times 2.5 is 7.5"

1.4  数组

var array1:Array = ["小米","拼接","校园"]

var array2 = ["小袁","hate","小米"]//声明一个空的数组 驻足中的元素都是String类型

var array3 = Array()

//声明一个空的String类型的数组

var array4 = [String]()

array2[1] = "love"

//向数组后面添加元素

array2 += ["何必","那么","认真"]

array2.append("123")

//只能添加一个数组

array2.appendContentsOf(["678","890"])

//插入元素

//在某个小标添加元素

array2.insert("结婚", atIndex: 0)

//在某个下标添加数组

array2.insertContentsOf(["他们结婚了,快发红包"], at: 0)

//删除最后元素

array2.removeLast()

//删除对应下标元素

array2.removeAtIndex(0)

//删除数组中所有元素

array2.removeAll()

//把数组类型提出来1.5 字典

let array1:[String] = ["A","2","3","4"]

//    ()代表初始化  相当于oc里面的 init/initWith

//数组里面的是字符串格式

let array2 = [String]()

//可变数组

var mutableArray = [String]()

mutableArray .append("hello")

mutableArray.append("world")

//mutableArray.append(23)

print(mutableArray)

//数组中遍历 for-in(明确的指出数组元素的类型)

for temp in array1{

print(temp)

}

//数组中遍历 for-in(明确的指出数组元素的类型)

for temp in array0 as [String]{

print(temp)

print(temp.characters.count)

}

//元组遍历 拿到下标

for (index,value) in array0.enumerate()

{

print("index = \(index),value = \(value)")

1.5 字典

var dict1: Dictionary= ["a":10]var dic1 = ["b":20]//空的字典var dict3 :Dictionary= [:]var dict31 :Dictionary= [:]var dict32 = Dictionary()

dict3 = ["b" : "c"]

//删除对应下标,key对应的Value

dict3.removeValueForKey("b")

//删除所有

dict3.removeAll()

/for - in 遍历

for (tempKey, tempvalue) in dict

{

print("key = \(tempKey),value = \(tempvalue)")

}

//可变字典

var dict3 = ["key":"value"]

//字典的合并 通过遍历合并

for (tempkey,tempValue) in dict

{

//如果key存在 则是一个更新键值对的操作  如果不存在 则是增加一个键值对的操作

dict3[tempkey] = tempValue;

}

print(dict3)

1.6 元组(元组  类似C语言中的结构体  他可以存放字符串字典 数组  而且可以存放在一起)

var aaa = ("b" , ["a":"b"],["a","b","c"],"a")

aaa.0

aaa.1

aaa.2[2]

aaa.3

②循环

2.1、 for in 循环

//在Switf3.0之前可以这样写

for var v = 0 ;v < 10 ; v ++

{

}

for var v = 0; v < 10; v ++

{    print(v)

}


在Switf3.0之后可以这样写

//[0,10]

for f in 0...10

{

print(f)

}

//[0,10)

for f1 in 0..<10

{

print(f1)

}

//条件分支

//if 条件语句()可以省略 ,{}不可以省略

//if 没有非零即真的概念

let tempValue = 10

if tempValue > 5{

print("tempValue > 5")

}

//可选类型的条件分支3种

let Str:String? = "hello"

// (1)if - let  只能是对可选类型的判断 如果可选可行为空 则不执行代码块,如果不为空则用tempStr来接受刺客这个可选类型的解包的值

if let tempStr = Str{

print(tempStr)

}

//(2) if let - where跟 if - let,where是对前面定义的这个局部变量在左一层判断

if let tempStr = Str where tempStr.characters.count > 2

{

print("tempStr.length = \(tempStr.characters.count)")

}

//(3)guard - let -else( 守护)

//如果可选类型Str为nil ,则执行code代码块 最后一定要把return ,如果不为nil 则强制解包后的值赋给tempStr,这样{}外面就可以使用tempStr

//guard let tempStr = Str else{

//    return

//}

// tempStr.........

2.2 while循环

var f2 = 10

while (f2 < 100)

{

// 在Switf 3之后 不能使用i++要写成 i+=1

f2 += 1

print(f2)

}

//repeat..while

repeat{

f2 += 1

}while (f2 < 1000)

2.3判断

if (a == 10)

{

print("123")

}else{

print("456")

}

③ Switch

switch 不局限判断整形 可以是浮点型 也可以是字符串等等.....

switch后面的小括号可以省略 ,大括号不能省略

case后面至少有一条执行语句!! 并且case后面的大括号可以省略 break可以不写 不会造成贯穿,,default一定要写 并且只能写在后面

let f = 3.2

switch f{

case 3.0:

print("==3.0")

case 3.1:

print("==3.1")

case 3.2:

print("==3.2")

default:

print("unknow")

}

④枚举((枚举值可以关联任意类型,浮点型,字符串型...,没有默认的关联值)关联如果是整型的话,会默认递增上去,如果不是Int类型的话 必须每个枚举值都关联上对应的值)

enum Month1:Int {

case January = 10

case February

case March

case April

}

//关联整型

enum Month:Int {

case January

case February

case March

case April

}

float类型

enum Month:Float {

case January = 10.1

case February = 11.2

case March = 11.3

case April = 11.4

}

//如果明确指出一个变量/常量是属于哪种枚举类型的话 可以直接.枚举值赋值,否则就  枚举类型.枚举值

let month:Month = Month.January

let month1:Month = .January

var month2 = Month.February

month2 = .January

switch month{

case.January:

print("hashValue = \(month.hashValue), rawValue = \(month.rawValue)")

print(month)

case.February:

print("hashValue = \(month.hashValue), rawValue = \(month.rawValue)")

print(month)

case.March:

print("hashValue = \(month.hashValue), rawValue = \(month.rawValue)")

print(month)

case.April:

print("hashValue = \(month.hashValue), rawValue = \(month.rawValue)")

print(month)

}

⑤ ? 和 !的用法和区别

?: 表示 可选性 即 有值 没有值;

let a :Int?  //这样是没有任何意义  但是var 是可以的

//其实 ? 本质上是一个枚举 有两种状态  optional(有值) potional(没值)

var a :Int?  //代表初值为nil

print(a)

//var a: Int? = 10

//print(a)

! 代表肯定有值,当声明变量的时候  后面没有 ? 的话,必须给一个初值

var a:Int! = 10

print(a)

解包/强制解包  解包:有很多种方式  但是解包有很多种缺陷  如果我们强制解包了  那个值没有初值 那么程序就会崩溃

var a: Int? = 10

var b = a!

print(b)

print(a!)


var a:Int? = 10

var b: Int! = a

print(b)

//强制解包

var a:Int? = 10

var b = a

print(b!)

这种初值为0 强制解包 造成程序崩溃

var a:Int?

var b = a

print(b!)


⑥ 函数(四种形式)

//无参数无返回值

func test()

{

print("i love swift")

}

//无参数有返回值

//OC - (int)test1;

func test1() -> Int

{

return 10

}

test1()

//有参数无返回值

//当方法有参数的事后  第一个参数名 不显示  要在前面加上参数名

func test2(num1 num1: Int,num2 :Int) {

print(num1 + num2)

}

test2(num1: 10, num2: 20)

/有参数有返回值

func test3(num1 :Int,num2 :Int) ->Int

{

return num1 + num2

}

test3(10, num2: 10)

//元祖作为返回值

func yuanzu(num1 :Int,num2 :Int) -> (Int,Int)

{

return (num1 + num2,num1 * num2)

}

yuanzu(10, num2: 10)

//函数的嵌套

func test4()

{

print("1")

func test5()

{

print("2")

}

test5()

}

test4()

/*

外部参数:外面调用的饿时候 能够看到的是参数

内部参数  内部进行运算的事后需要用到的参数

func test(外部参数1 内部参数1: Int,外部参数2 内部参数2 : Int) ->返回值

{

return 内部参数1 +内部参数2

}

test6(外部参数1: 10, 外部参数2: 10)

*/

func test6(num1 a :Int,num2 b:Int) -> Int {

return a + b

}

test6(num1: 10, num2: 10)

//在函数中  所有的参数类型都是let来修饰的,所以我们要改变的话  就必须再不声明一个 Var变量

//inout 修饰相当于 我们之前的指针变量  让外界传进来一个值 来修改我们的值

func test7(inout num1 :Int,num2 :Int) {

num1 = 100

print(num1 + num2)

// return num1 + num2

}

var number1 = 10

var number2 = 10

test7(&number1, num2: number2)

//简单52626计算器

//要求使用外接传入两个数 和一个的符合 + - * /来进行计算结果

//要求使用函数嵌套

func jisuanqi (num1 :Float,fuhao:Character ,num2:Float) -> Float

{

switch (fuhao)  {

case "+":

func jia(a :Float, b:Float)->Float{

return a + b

}

return jia(num1, b: num2)

case "-":

func jian(a :Float, b:Float)->Float{

return a - b

}

return jian(num1, b: num2)

case "*":

func cheng(a :Float, b:Float)->Float{

return a * b

}

return cheng(num1, b: num2)

case "/":

func chu(a :Float, b:Float)->Float{

return a / b

}

return chu(num1, b: num2)

default:

return 0

}

}

⑦ 闭包(类似block 形式)

/*

int (^aaa)(int a,int b) = ^{

}

*/

/*闭包格式  闭包作用回调传值

var 闭包变量 ={

(参数名:参数类型)-> 返回值类型 in

代码块

}

*/

var max = {

(a: Int,b:Int)->Int in

return a > b ? a : b

}

print(max(10,20))

var stringLenth = {

(string:String) -> Int in

return string.characters.count

}

print(stringLenth("12300"))

//  输入两个字符串,输入一个闭包(将刚才输入的两个字符串当做参数,并且返回一个拼接好的新的字符串)

func combineString(str1:String,str2:String,closure:(tempStr1:String,tempStr2:String) -> String) {

combineString("hello", str2: "world") { (tempStr1, tempStr2) -> String in

return "\(tempStr1)\(tempStr2)"

}

//闭包执行

let string =

closure(tempStr1:str1,tempStr2:str2)

print(string)

}


//定义一个方法  (输入参数color,frame,closure(是将刚才的color,frame

//当做参数,返回一个UIView)),返回一个UIView,添加到View上

func setFunc(color:UIColor,frame:CGRect,closure:(tempColor:UIColor,tempFrame:CGRect) -> UIView) -> UIView {

let view:UIView = closure(tempColor:color,tempFrame:frame)

return view

}

let view:UIView =

setFunc(UIColor .blueColor(), frame: CGRectMake(0, 0, 375, 667)) { (tempColor, tempFrame) -> UIView in

let view = UIView()

view.backgroundColor = tempColor

view.frame = tempFrame

return view

}

view.addSubview(view)

//swift里面不写self 一般只有在闭包内部才会强制要求写self

*/

⑧ 懒加载

//懒加载一个控件

/*

lazy var 变量名:变量类型 = {

code

return

}

*/

lazy var btn:UIButton = {

var tempBtn = UIButton(type:UIButtonType.ContactAdd)

tempBtn.frame = CGRectMake(80, 100, 60, 60)

tempBtn.backgroundColor = UIColor.greenColor()

return tempBtn

}()

3.单例

① 创建一个类



//单例写法一

/*

let s1 = singleDog.shareSingleDog

s1.name = "wangqiang"

let s2 = singleDog.shareSingleDog

print(s2.name)

*/

//单例写法二

/*

let s3 = singleDog.shareSingleDog()

s3.name = "zhangsan"

let s4 = singleDog.shareSingleDog()

print(s4.name)

*/

4.异常捕获

1.创建 json文件


2.在viewController中viewDidLoad进行数据解析json文件

let path = NSBundle.mainBundle().pathForResource("iOS04", ofType: "json")

let data:NSData = NSData(contentsOfFile: path!)!

do{

let rootArray = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! [[String :String]]

print(rootArray)

}catch{

//异常捕获 序列化出错的时候就自动来到这里

print("error")

}

3.创建一个类作为model

//字典转模型 模型中如果有基本数据类型的话  基本数据类型不可以为可选类型,否则在KVC赋值中会找不到对应的key值,如果可选类型话 应该给初始值

var age:Int = 0

var gender:String?

//字典转模型

init(dict:[String:AnyObject]) {

super.init()

setValuesForKeysWithDictionary(dict)

}

// 如果自定义了初始化方法并且没有实现系统默认的初始化方法,那么外界访问不到该类的默认初始化方法,想要访问的花必须手动实现

//    override init() {

//        super.init()

//    }

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

推荐阅读更多精彩内容