swift001

前言

现在的swift也算是成熟了吧,感觉再不学习swift就要被淘汰了,以后做一下学习swift的笔记。想做的时候就做点,忘记写笔记了就不写了,随性一点 ----自己胡扯

swift和OC的不同

应该是有很多不同点只记录其中的一点

  1. 初始化() 代替 alloc / init let btn = UIButton()
  2. 访问属性可以不同self, 直接使用属性名 view.addSubview(v)
  3. 类方法就是方法名字前面加了static
  4. 一行一句时不用使用;结尾J
  5. 枚举类型可以直接使用 .枚举值调用
  6. @selector 变为 #selector()监听方法,,带参数不用使用冒号‘:’
  7. 打印方法名使用 #function
一些技巧
  1. option + cmd + / 出现注释斜线
  2. 输入color后回车有奇迹
  3. 标注
    3.1 // MARK: - 标注1
    3.2 // MARK: 标注2
    3.2 // TODO: 要做的
    3.4 // FIXME: 要修改的
  4. iv.image = #imageLiteral(resourceName: "hhhha") --->这个在代码中不是这样的 输入图片名字后回车显示图片很好看
  5. 任何不同的类型之间,不允许直接计算,需要显示转化 例如Int(a)
  6. swift不存在基本数据类型,都是结构体
  7. 先使用let生命变量,需要改时再用var
  8. 使用!强制拆包时要确定变量有值
  9. 仅仅一个()表示空执行
  10. if let/var else 连用判断可选类型是否为空
iflet-else 和guard let-else-return
func f() {
    let oName: String? = nil
    let oAge: Int? = nil

    if let name = oName, let age = oAge {
        print(name + String(age))  // oName和oAge都不为空才执行,name 和age只能在这个区域中访问
    } else {
        print("nil")  // 执行    oName和oAge有一个为nil值便执行else语句
    }
    // 如果oName和oAge有一个为nil值,执行else后面的语句,然后return(不能少), 如果oName和oAge都不为空,跳过else语句继续执行,name和age可以访问了
    guard let name = oName, let age = oAge else{
        print("nil") // 执行
        return  // 退出了
    }
    
    print(name + String(age))
 
}

100个tipz中优雅的使用if let,其中有一个为nil便结束了

if let value = JSON(json)["menu"]["popup"]["menuitem"][0]["value"].string {
    print(value)
}
switch
/*
 1. swift 可以直接对任意类的值进行分支, 不再局限于整数
 2.一般不需要break
 3.可以使用',',分开多值
 4.所有分支至少需要一条指令,如果什么都不干才使用break
 5.swift中 可以进行复制和使用where字句
 */

func demo(num: String) {
    switch num {
    case "10", "9":
        print("优秀")
    default:
        print("一般")
    }
}

demo(num: "9")

func f2() {
    let point = CGPoint(x: 10, y: 10)
    switch point {
    case let p where p.x == 0 && p.y == 0:
        print("原点")
    default:
        print("11")
    }
}
for循环
for i in 0..<5 {
    print(i)
}

let r2 = 0..<5 // 类型  CountableRange<Int>
let r1 = 0...5  // 类型  CountableClosedRange<Int>
print(r1)  // 0...5

for i in (0...5).reversed() {
    print(i)
}
字符串
// 字符串遍历
let str = "今天天气不错"
for c in str.characters {
    print(c)
}
// 字符串长度
print(str.lengthOfBytes(using: .utf8))  //返回指定编码的字节  一个汉字3个字节
print(str.characters.count) //6 字符串长度,返回字符的个数
let ocStr = str as NSString    // 值 as 类型  --> 类型转换
print(ocStr.length) // 6

// 字符串拼接
let name = "老王"
let age = 18
let title: String? = "BOSS"
let point = CGPoint(x: 1.0, y: 2.0)
let str = " \(name) \(age) \(title ?? "") \(point)"  //  老王 18 BOSS (1.0, 2.0)

// 格式化
let h = 8
let m = 9
let s = 6
let dateStr1 = String(format: "%02d:%02d:%02d", h, m, s) // 08:09:06
字符串的子串
// 一般使用NSString作为中转, 因为Swift取子串的方法一直在优化
let str = "我们一起加油!"
print(str.substring(from: "我们".endIndex))  // 一起加油!
print(str.substring(to: "asd".endIndex))  // 我们一
func hh() {
    let str = "我们一起加油!"
    guard let range = str.range(of: "一起") else {
        print("meiyou zhao dao")
        return
    }
    print(str.substring(with: range))
}
// 转换成OC
let ocStr = str as NSString
let s1 =  ocStr.substring(with: NSRange(location: 2, length: 3)) // 一起加
print(s1)

print("------")
let greeting = "Guten Tag!"
greeting[greeting.startIndex]  // G
greeting[greeting.index(after: greeting.startIndex)] // u
greeting[greeting.index(before: greeting.endIndex)] // !
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index] // a
//greeting[greeting.endIndex] // error  越界

for index in greeting.characters.indices {
    print("\(greeting[index]) ", terminator: "")  // G u t e n   T a g !
}

var welcom = "hello"
welcom.insert("!", at: welcom.endIndex)  // hello!


welcom.insert(contentsOf:" there".characters, at: welcom.index(before: welcom.endIndex)) // "hello there!"
welcom.remove(at: welcom.index(before: welcom.endIndex))  // hello there

let range = welcom.index(welcom.endIndex, offsetBy: -6)..<welcom.endIndex
welcom.removeSubrange(range) // hello
数组
let array = ["张三", "小芳", "小样"]
let p1 = CGPoint(x: 1, y: 2)
let arr1 = ["张三", 1, p1] as [Any]  // arr1 中元素的类型为 Any

数组的遍历
数组反向遍历可以避免删除操作时造成的崩溃, 例如,删除数组中的一个后继续操作数组,正向遍历,删除一个后元素后,后面的元素向前补齐,序号和一开始就不一样了。。。 后续遍历时,删除其中的一个,后面的元素向前补齐,后面的元素就已经操作过了,

let array = ["张三", "小芳", "小样"]
for i in 0..<array.count {
    print(array[i])
}

for s in array {
    print(s)
}

for s in array.reversed() {
    print(s)
}

// 3.enum block  遍历  同时遍历下标和内容
for e in array.enumerated().reversed() {
    print(e) // e 为元组类型   (offset: Int, element: String)
    print(e.offset)
    print(e.element)
}
/*
 2, 小样
 1, 小芳
 0, 张三
 */
// 4.遍历下标和内容
for (n, s) in array.reversed().enumerated() {       // 错误的反序遍历 索引和内容不一样
    print("\(n), \(s)")  // n 索引下标  s 对应的元素  n、s名字随便起
}
/*
 0, 小样
 1, 小芳
 2, 张三
 */
for (n, s) in array.enumerated().reversed() { // 正确的反序遍历  应该先枚举再反序
    print("\(n), \(s)")  // n 索引下标  s 对应的元素  n、s名字随便起
}

/*
 2, 小样
 1, 小芳
 0, 张三
 */

var array = ["张三", "小芳", "小样"]
// 追加元素
array.append("老王")
// 修改
array[0] = "李四"
//array[5] = "呵呵哒" // 数组越界
// 删除
array.remove(at: 2)
array.removeLast()
array.removeFirst()
array.removeAll()
array.removeAll(keepingCapacity: true) // 删除全部保留空间    bool值只有true 和 false   
数组的容量
func dd() {
    var array: [Int]  // 声明
    array = [Int]()   // 初始化
    
    var array2 = [Int]()  // 声明和初始化一起
    
    for i in 0..<8 {
        array2.append(i)
        print("\(array2) 容量 \(array2.capacity)")
    }
    /*  插入元素时,如果容量不够会✖️2(初始为0,第一次就是2), 如果容量不够会在现有的基础上乘以2,可以避免每次都分配空间
    
 [0] 容量 2
 [0, 1] 容量 2
 [0, 1, 2] 容量 4
 [0, 1, 2, 3] 容量 4
 [0, 1, 2, 3, 4] 容量 8
 [0, 1, 2, 3, 4, 5] 容量 8
 [0, 1, 2, 3, 4, 5, 6] 容量 8
 [0, 1, 2, 3, 4, 5, 6, 7] 容量 8
 */
}
// 如果初始化指定容量,可以避免插入数据时,重复分配空间,效率会高一点点
//NSMutableArray *arrM = [NSMutableArray arrayyWithCapacity:10];

// 数组的合并
var arr = ["1", "2", "3"]
let arr2 = ["🙄", "😀", "💔"]
let arr3 = arr + arr2  // 要合并的两个数组的类型必须一致     ["1", "2", "3", "🙄", "😀", "💔"]

字典
// 1.定义
var  dic = ["name": "张三", "age": 18] as [String : Any]
let array = [
    ["name": "张三", "age": 18],
    ["school": "jialidun", "score": 00]
]
/*
 所有对象能被转成JSON(字典或者数组) 必须遵守:
 1.节点是数组/字典
 2.所有对象必须是 NSString, NSNumber or  NSNull, NSArray、NSDictionary可以嵌套使用
 3.所有的KEY都是NSString
 4.NSNumber不能为nil或者无穷大
 */
print(array)

// 增删改  是通过KEY取值的  KEY唯一  如果KEY不存在就是新增,KEY存在就是修改
dic["title"] = "新增加的"
dic["name"] = "改过名了"
dic.removeValue(forKey: "age")
// 字典是通过KEY来定位值的,KEY必须是可以’hash 哈希‘的  MD5 是一种 
// hash 就是将字符串变换成唯一的’整数‘ ,便于查找,提高字典遍历的速度

// 遍历
for e in dic {
    print(e)  // e 的 类型  (key: String, value: Any)
    print(e.key)
    print(e.value)
}
for (key, value) in dic {
    print("\(key): \(value)")
}

// 合并 
// 字典不能直接相加
let dic2 = ["name": "😑", "school": "🏠"]
for e in dic2 {
    dic[e.key] = dic2[e.key]
}

心态变则意识变,意识变则行为变,行为变则习惯变,习惯变则性格变,性格变则命运变。

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

推荐阅读更多精彩内容

  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,829评论 0 6
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,783评论 1 10
  • 现代移动互联网时代,也是网红经济时期。网红已家喻户晓,深入到百姓生活当中,成为网红也是当今好多年轻人的愿望。那么,...
    裕雅说动漫阅读 149评论 0 1