一、常量和变量
1、在swift中申明变量或者常量的时候可以不用变量或常量类型,因为系统会帮我们自动推导出对应的类型
变量
var a = 10
常量
let b = 20
在swift中我们的变量名可以实用表情或者中文表示
var 😏 = 20
var 一哥 = 20
😏 + 一哥
2、当我们的变量有小数点的时候,会自动推导出double类型
var yige:Int = 20
var yijie:Float = 1.8
var erge:String = "涨价"
var erjie:Character = "周"
swift不支持隐式转换,在OC中强制转换
yige + Int(yijie)
3、常用操作
字符串拼接:+
判断两个字符串是否相等:==
4、数据类型的写法
空数组的写法
var array3 = Array<String>()
var array4 = [String]()
添加元素
array2 += ["何必"]
array2.append("123")
array2.appendContentsOf(["333"])
array2.insert("jiehun", atIndex: 2)
array2.insertContentsOf(["222", "234"], at: 3)
删除元素
array2.removeLast()
array2.removeAtIndex(2)
array2.removeFirst()
array2.removeAll()
字典的写法
var dict1:Dictionary<String, Int> = ["a" : 10]
var dict2 = ["b" : 20]
var dict3:Dictionary<String, Int> = [:]
var dict4 = Dictionary<String, Int>()
dict3 = ["b" : 30]
删除字典元素
dict3.removeValueForKey("b")
dict1.removeAll()
元组
var aa = ("b", ["a", "b"], ["a" : 20])
访问元组中的数据
aa.0
aa.1[1]
aa.2
5、?、!、??
?表示该值是可选类型。即可能有值,也可能为nil,可选类型不能直接使用,必须进行“!强制解包”
var a:String?
!表示强制解包,只有用到?号才会使用!解包。因为带?号的值中包含有Optional,只有解包后才能拿到完整的值。但是对nil进行解包会造成程序Carsh
print(a!)
??的作用是 当变量或常量没有值时,使用??后面的值,有值则使用原来的值
print((a ?? "123").characters.count)
6、数据结构
while循环
var f1 = 10
while f1 < 40 {
f1 += 1
print(f1)
}
//do while循环
repeat {
f1 += 1
} while f1 < 20
// 判断
if 没有非零即真的概念,只有true和false的两种情况
if let tempStr = str {
print(tempStr)
}
if-let-where 和if-let相似,where是对前面定义的这个局部变量在做一层判断
if let tempStr = str where tempStr.characters.count > 2 {
print(tempStr.characters.count)
}
guard-let-else
如果str为空,则执行代码块。代码块中最后一定要return出来。不为空,则强制解包后赋值给tempStr,代码块不执行。和if-let效果相反
guard let tempStr = str else {
return
}
// switch
// 每个分支后不用写break,不会造成贯穿效果。但是结尾必须写default,并且每个case后,必须有代码进行处理
switch a {
case 0:
print("123123")
case 10:
print("432143321")
default:
print("32451")
}
// 枚举
// 在枚举中,直接取值只能取到等号左边的值,只有加上rawValue才能取到等号右边的值
关联如果是Int,会默认的递增上去,如果不是Int,必须每个枚举值都关联上对应的值。String一样
enum couples: String
{
case yige = "王康威"
case yijie = "袁敏"
case erge = "张加法"
case erjie = "周抚平"
}
var hehe = couples.yige.rawValue
enum hahaha: Int {
case a = 1
case b = 2
case c = 3
}
rawValue能获得枚举中等号右边的值
var heihei = hahaha.a.rawValue
hashValue能获得改枚举值在枚举中的位置。位置是从0开始计算的
var heihei = hahaha.a.hashValue
7、函数
// 有参有反
func jiafa(a:Int, b:Int) -> Int {
return a + b
}
// 有参无反
func action(a: Int) -> Void {
print(a)
}
// 无参有反
func action1() -> Int {
return 5
}
// 无参无反
func action2() -> Void {
print("无参无反")
}
8、闭包(就是OC中的block)
写法和调用
let closure = {
()->() // void也表示无反
in
print("无参无反")
}
closure()
let closure1 = {
(string:String) -> Void
in
print(string)
}
closure1("有参无反")
let closure2 = {
() -> String in
return "无参有反"
}
print(closure2())
let closure3 = {
(str:String) -> String in
return str + "6666"
}
print(closure3("有参有反"))
函数与闭包结合使用
函数声明部分
func createView(coloc:UIColor, frame:CGRect, closure:(c:UIColor, f:CGRect) -> UIView) -> UIView {
return closure(c: coloc, f: frame)
}
函数调用部分
// swift里面不写self,一般只有闭包内部才会强制要求写self
view.addSubview(createView(UIColor.redColor(), frame: CGRectMake(100, 100, 100, 100)) { (c, f) -> UIView in
let v:UIView = UIView(frame: f)
v.backgroundColor = c
return v
})
9、单例
var name:String?
单例写法1
static var shareSingleDog:SingleDog = {
let instance = SingleDog()
return instance
}()
单例写法2
static let instance = SingleDog()
static func shareSingDog() -> SingleDog {
return instance
}
10、KVO
var name:String?
var gender:String?
字典转模型中,模型中如果有基本数据类型的话,基本数据类型不可以为可选类型,否则在KVC赋值中会找不到对应的key值。如果为可选类型的话,应该给初始值
var age:Int = 0
init(dict : [String:AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
如果自定义了初始化方法并且没有实现系统默认的初始化方法,那么外界访问不到该类的默认初始化方法,想要访问的话必须手动实现
override init() {
super.init()
}
调用部分
let dict = ["name" : "zhangsan", "age" : 12, "gender" : "male"]
let person:Person = Person(dict: dict)
11、 json数据解析、异常捕获
let path = NSBundle.mainBundle().pathForResource("iOS04", ofType: "json")
let data:NSData = NSData(contentsOfFile: path!)!
let arr = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! [[String : String]]
异常捕获使用do{} catch {}
try 表示弱try,即解析出错,程序不奔溃
try? 表示强try,即解析出错,程序立刻奔溃
一般使用try即可
do {
let arr = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! [[String : String]]
print(arr)
} catch {
// 异常捕获,序列化出错的时候自动来到这里
print("error")
}
来源:https://www.cnblogs.com/chunyu-iOS/p/5692935.html