Swift
1.Swift项目与OC项目的区别
- Swift的类文件是以 .swift 结尾
- main.m 不见了,程序入口以 `@UIApplicationMain`
- Swift中,代码都是写到 `{}` 标识的代码块里面
- 在 Swift 中,每一行代码的末尾不用跟上 `;`
- OC 中的 initWithXXX 换成 `类名(XXX:__)` [init(XXX:)]
- Swift 中使用 `点 .` 的方式去调用方法
- Swift 枚举分为 `大类型.小类型`,而且大类型可以省略
- Swift 中,当前类的属性或者方法都可以不用 self. 开头,建议大家不要加.因为在后面闭包的使用的时候,闭包里面会使用 self
- Selector: 两种表现形式 Selector("buttonClick") / 在要传入 Selector 的地方 直接填写 "buttonClick"
- 在 Swift 中使用 print 作打印语句
2.常量和变量
- 使用 `let` 定义常量
- 使用 `var` 定义变量
- 在 Swift 中,有 `自动推导`,会根据等号后面的值,推断出前面变量(常量)的类型,也就是说,可以不用显式的去指定类型
- 在 Swift 中对类型检测非常严格,没有 `隐式转换`,只有类型相同的变量(常量)才能进行运算
- option + click 查看变量(常量)类型
- let 与 var 如何选择: 先使用 let 定义,如果需要更改的话,再变成 var
3.可选类型
- fatal error: unexpectedly found nil while unwrapping an Optional value
- 什么是可选类型: 一个变量(常量)可能有值,可能为nil,那么它就是一个可选类型
- 可选类型的变量不能直接进行运算 ,要强制解包(使用 !) 或者判断其是否有值再计算
- 使用 `?` 标识变量是一个可选类型的变量
- 输出的时候如果发现 `Optional(xxx)` 字样,代表打印的变量是一个可选类型
- `!` 用于标识可选类型的变量一定有值 [解包] (程序员向系统保证 ,a 里面一定有值,你去取a的值去计算,如果没有取到值,系统就会崩溃)
- 我们在使用 `!` 的时候,一定要小心,要确保其修饰的变量一定有值,
- `??` 空合并运算符,判断其前面的可选值是否真的有值,如果有,就直接返回该值,如果为nil,就使用 其后面的值进行运算
4.if语句
- 条件语句可以不使用 `()` 圆括号括起来
- `{}` 执行代码块的花括号不能省略
- 在 Swift 中是没有`非0即真`概念,条件语句只能有 true/false
let a = // 判断 a 是否大于5, 如果大于5,就打印一句话
if a > {
print("a 大于 5")
}
// 方式1
// 运算符的左右空格一定要对称 (空格大法)
if url != nil{
let request = NSURLRequest(URL: url!)
print(request)
// 如果下面有很多代码,并且多次使用 url ,都需要强行解包
} // 方式2: 使用 if let
// if let 会判断 url 是否有值,如果没有值,什么都不错
// 如果有值,会把 url 的值取出来赋值给 u,并且进入到 if 的执行代码块中
if let u = url {
let request = NSURLRequest(URL: u)
print(request)
}
if let 与 guard let
func demo6(){
// let url = NSURL(string: "http://www.baidu.com")
//
// if let u = url {
// let request = NSURLRequest(URL: u)
// print(request)
// // 写很多逻辑
// } let url = NSURL(string: "http://www.qq.com")
guard let u = url where u.host == "www.baidu.com" else {
print("url为空或者不符合条件")
return
}
let request = NSURLRequest(URL: u)
print(request) }
5.switch
let scoreStr = "优"
switch scoreStr {
case "优":
print("大于等于90小于等于100")
case "良":
print("大于等于80小于90")
case "中":
print("大于等于60小于80")
case "差":
print("大于等于0小于60")
default:
print("其他")
} // 判断一个范围
let score =
switch score {
case _ where score >= && score <= :
print("优")
case let s where s < && s >= :
print("良")
case let s where s < && s >= :
print("中")
case let s where s < :
print("差")
default:
print("其他")
}
6.循环
// 方式1: 仿照oc写
// for (int i=0; i<3; i++) {
// NSLog(@"哈哈");
// }
for var i = ; i < ; i++ {
print(i)
} print("==========")
// 方式2: for in
for i in ..< {
print(i)
} print("==========")
for i in ... {
print(i)
} print("==========") // 方式3: 只需要遍历的次数,不需要当前遍历到哪个位 for _ in ..< {
print("哈哈")
}
// var i = 10
// while i > 0 {
// i--
// print(i)
// } var i =
// do while 在 Swift 2.0 Xcode 7.0 beta5
// 改成repeat while
repeat {
i--
print(i)
}while (i > )
7.字符串
/// 字符串的截取
func demo4(){ let str = "听说下雨天音乐和辣条更配哟" // 截取: 下雨天音乐和辣条更配哟
let r1 = str.substringFromIndex(str.startIndex.advancedBy())
print(r1) // 截取: 听说下雨天音乐和辣条更
let r2 = str.substringToIndex(str.endIndex.advancedBy(-))
print(r2) // 截取: 下雨天音乐和辣条更
let startIndex = str.startIndex.advancedBy()
let endIndex = str.endIndex.advancedBy(-)
let r3 = str.substringWithRange(startIndex..<endIndex)
print(r3) // 如果以上的代码不会写,可以把 String 转成 NSString 进行截取
let range = NSMakeRange(, str.characters.count - )
let r4 = (str as NSString).substringWithRange(range)
print(r4) } /// 字符串的拼接
func demo3(){ let name = "老王"
let age =
// 打印出:我叫老王年龄18 // 方式1: 使用 `+`
let r1 = "我叫" + name + "年龄" + String(age)
print(r1) // 方式2: 使用 `\(_常量或者变量名_)`
let r2 = "我叫\(name)年龄\(age)"
print(r2) // 使用 formatter 的情况 let h =
let m =
let s = // 输出 09:10:03 let r3 = String(format: "%02d:%02d:%02d", h, m, s)
print(r3) let r4 = String(format: "%02d:%02d:%02d", arguments: [h, m, s])
print(r4) } /// 字符串的长度获取
func demo2(){
let str = "别哭泣,老王会笑"
// 获取字符串的长度
print(str.characters.count)
print(str.utf8.count)
print(str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
} /// 字符串的遍历
func demo1(){
let str = "别低头,绿帽会掉"
for value in str.characters {
print(value)
}
}
8.集合
// 合并字典
func demo7(){
var dict1 = ["name": "老王", "age": ]
let dict2 = ["no": "哈哈", "height": , "name": "老李"] for (k,v) in dict2 {
dict1[k] = v
}
print(dict1)
} /// 遍历字典
func demo6(){
let dict = ["name": "老王", "age": ]
for (k,v) in dict {
print("key:\(k);value:\(v)")
}
} /// 字典的定义以及初始化
/**
- 使用 let 定义不可变的字典,使用 var 定义可变的字典
*/
func demo5(){
// 类型: [String : NSObject]
// let dict1 = ["name": "老王", "age": 18]
// print(dict1) // 初始化一个空字典
var dict2 = [String : NSObject]()
dict2["name"] = "老王"
dict2["age"] =
print(dict2) // 这种方式赋值的话,如果字典里面存对应key的键值对的话,会覆盖掉原来的值
dict2["name"] = "老李"
print(dict2) // // 取值
// let r1 = dict2["name"]
// print(r1) // 移除值
dict2["name"] = nil
print(dict2)
} // 数组的容量,容量就代表数组能够装多少元素
func demo4(){ var array = [Int]()
for i in ..< {
array.append(i)
// 打印array的容量
print("当前count:\(array.count),容量是:\(array.capacity)")
}
} // 数组的合并
func demo3(){
var array1 = ["老王", "老张"]
let array2 = ["老李", "小尹"] array1 += array2
print(array1) // let result = array2 + array1
// print(result)
} // 数组的遍历
func demo2(){
let array = ["老王", "老张", "老李"] // 方式1:
for var i = ; i < array.count; i++ {
print(array[i])
} print("============")
// 方式2: for in for value in array {
print(value)
} // 方式3:
for (index, value) in array.enumerate() {
print("index=\(index);value=\(value)")
}
} /// 数组的定义,初始化
/**
- 使用 let 定义不可变数组,使用 var 定义可变数组 */
func demo1(){ // var a = ["老王", 10]
// a.append(NSValue(CGRect: CGRectZero)) // var a = [CGRectZero, CGRect(x: 0, y: 0, width: 10, height: 10)]
// a.append(CGRectZero) // 定义一个数组
let array1 = ["老王", "老李", "老张"] print(array1)
// 定义一个空数组
var array2: [Int] = [Int]()
// 添加元素
array2.append()
array2.append()
array2.append()
print(array2) // 数组取值
print(array2[]) // 移除值
array2.removeFirst()
print(array2)
}
9.函数
override func viewDidLoad() {
super.viewDidLoad()
// demo1()
// sum1(10, b: 5)
// sum2(num1: 4, num2: 6) // let result = sum3(num1: 5, num2: 7)
// print(result) demo() } // 任务1: 定义一个没有参数没有返回值的函数
// 格式: func 函数名() { __函数执行代码__ }
func demo1(){
print("哈哈")
} // 任务1: 定义一个有参数没有返回值的函数
// Swift中函数的第一参数名字在调用的时候默认省略
// 格式: func 函数名(形参名1: 类型, 形参名2: 类型, ...) { __函数执行代码__ }
func sum1(a: Int, b: Int) {
print(a + b)
} // 带有外部参数的函数
// 格式: func 函数名(外部参数名1 形参名1: 类型, 外部参数名2 形参名2: 类型, ...) { __函数执行代码__ }
func sum2(num1 a: Int, num2 b: Int) {
print(a + b)
}
/// 定义一个有参数有返回值的函数(有外部参数的函数)
// 格式: func 函数名(外部参数名1 形参名1: 类型, 外部参数名2 形参名2: 类型, ...) -> 返回值类型 { __函数执行代码__ }
func sum3(num1 a: Int, num2 b: Int) -> Int {
return a + b
} // 没有返回值的3种表现形式 // 方式1
func demoAA(){ } // 方式2
func demoBB() -> Void { } // 方式3
func demoCC() -> () { } // 嵌套函数
func demo(){
// 作用范围是在当前 demo 的函数体内
func haha(){
print("哈哈")
} haha()
}
10.闭包
override func viewDidLoad() {
super.viewDidLoad()
demo3A()
demo3B()
} // MARK: - 定义一个有参数有返回值的闭包 // 任务3: 定义一个有参数有返回值的闭包
func demo3B(){
// 闭包的类型: (num1: Int, num2: Int) -> Int
let clourse = { (num1 a: Int, num2 b: Int) -> Int in
return a + b
} let result = clourse(num1: , num2: )
print(result) } // 内部定义一个有参数有返回值的函数
func demo3A(){ func sum(num1 a: Int, num2 b: Int) -> Int {
return a + b
} let result = sum(num1: , num2: )
print(result)
} // MARK: - 定义一个有参数没有返回值的闭包 // 任务2: 定义一个有参数没有返回值的闭包
func demo2B(){ // 有参数没有返回值的闭包类型: (num1: Int, num2: Int) -> ()
let clourse = { (num1 a: Int, num2 b: Int) in
print(a + b)
} clourse(num1: , num2: )
} // 内部定义一个有参数没有返回值的函数
func demo2A(){ func sum(num1 a: Int, num2 b: Int) {
print(a + b)
}
sum(num1: , num2: )
} // MARK: - 定义一个没有参数没有返回值的闭包 // 任务1: 定义一个没有参数没有返回值的闭包
func demo1B(){
// 没有参数没有返回值的闭包的类型: () -> ()
let clourse = {
print("哈哈")
}
clourse() // 定义一个函数,将上面的闭包作为参数传入
// func haha(callback: () -> ()) {
// callback()
// }
} // 内部定义一个没有参数没有返回值的函数
func demo1A(){
func haha(){
print("哈哈")
}
haha()
} // MARK: - 没有返回值的三种情况 // 如果闭包没有参数没有返回值 func demo1(){
let clourse1 = { (num1 a: Int, num2 b: Int) -> () in
print("哈哈")
} let clourse2 = { (num1 a: Int, num2 b: Int) -> Void in
print("哈哈")
} let clourse3 = { (num1 a: Int, num2 b: Int) in
print("哈哈")
} }
Swift的更多相关文章
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- Swift enum(枚举)使用范例
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
随机推荐
- iOS-Runtime知识点整理
本文目录 1.Runtime简介 2.Runtime相关的头文件 3.技术点和应用场景 3_1.获取属性\成员变量列表 3_2.交换方法实现 3_3.类\对象的关联对象,假属性 3_4.动态添加方法, ...
- Linux查看进程PID信息
ps -ef|grep 进程名 可检索到具体进程PID以及启动命令行信息 ls -l /proc/进程ID Linux在启动程序时会在 /proc/PID 目录下以PID为名称创建一个文件存储相关进程 ...
- 开发中容易写错的一条SQL语句
select * from tableName where name = like '%糖糖%' 出错的地方:name后面有=和like 出错的原因:复制过来的,其它地方是=,没有删掉直接加了like ...
- 3.Powershell编辑器
工欲善其事,必先利其器.有个得心应手的工具会使你的学习事半功倍.使用什么工具来编辑Powershell指令比较方便呢?笔者前后使用过几个编辑器,有几个比较不错推荐给大家试用. Powershell I ...
- 一般企业网站,电商可以完全可以水平拓展的lanmp系统架构
本来不打算把所有的架构方案和基础技术写出,毕竟是吃饭的家伙事,拿这套东西去面试完全可以对付只做过中小网站的经验的开发面试人员,但是我也是从别人的博客和文章学习和实践出来的 如果你没有基础的linux一 ...
- python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)
1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...
- [转]你不需要jQuery
完全没有否定jQuery的意思,jQuery是一个神奇的.非常有用的工具,可以节省我们大量的时间. 但是,有些时候,我们只需要jQuery的一个小功能,来完成一个小任务,完全没有必要加载整个jQuer ...
- [skill] C++ delete VS delete []
delete 用来删除 new 返回的对象. 先调用对象的析构,然后释放指针指向的内存. delete[] 用来删除 new [] 返回的对象. 先调用数组中每一个对象的析构,然后释放指针指向的内存.
- pdb调试技巧
1.先import pdb 在适当的位置加上pdb.set_trace(),在cmd中运行脚本,就可以看到调试的提示符 2.常用的调试命令 h(elp),会打印当前版本,pdb可用的命令,如果要查询某 ...
- ASP.NET MVC 项目中 一般处理程序ashx 获取Session
1-在 aspx和aspx.cs中,都是以Session["xxx"]="aaa"和aaa=Session["xxx"].ToString( ...