swift001

2017-03-09  本文已影响16人  呦释原点
前言

现在的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]
}

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

上一篇下一篇

猜你喜欢

热点阅读