swift 4 使用小结之基本语法

本文总结了Swift 4的一些核心特性,包括它的类型推导、可选项(Optional)、for循环、switch语句的改进以及数组和字典的使用。Swift取消了预编译指令,提供了命名空间和泛型,并对Foundation框架进行了改造。同时,文章还讨论了如何处理可选项,如if let和guard let的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.swift特色

  • swift取消了预编译指令包括宏
  • 提供了类似Java的命名空间,泛型,运算对象重载
  • 对foundation框架做了重载,将其绝大部分class转换为struct
  • swift是弱语言,不会对类型做隐式转换,不同类型之间不能直接运算,需要手动转换
  • 变量和常量类型不给定,会根据赋值情况自动推导
  • 不存在基本的数据类型,Int,Double,CGFloat等都是结构体

2.资源

3.差异

  • 访问当前属性不用谢self. 闭包中访问需要使用self.
  • 基本不用;分割语句
  • 枚举类型不用写全名,直接.类型(UIButtonTypeContactAdd —> .contactAdd)
  • target - action的变化: @selector(buttonClick:) –> #selector(buttonClick(_ :))
  • 标记提示: //MARK: //TODO: //FIXME: //
  • if条件语句可以不适用()

4.可选项optional

let x: Optional = 10
let x: Int? = 10
print(x) 结果都是 optional(10)
  • 可选项不能直接参与计算
  • optional可能有值,可能没值
  • !可以进行强行解包,没有值得时候,强行解包是出错的

5.可选项处理if let和guard let和??

let name:String?
let age:Int?

//方法1: 可以连续判断
// if var 连用可以修改{变量的值,新变量的作用域仅仅在{}内起作用}
if let name = name, let age = age {
    print(name + String(age))
}

//方法2: 可以连续判断
guard let name = name, let age = age else {return}
print(name + String(age))

//方法3
print(name ?? "" + String(age))

函数调用

override func viewDidLoad {
    getUserInfo("iOS",25)
}

fun getUserInfo(_ name:String?, _ age:Int?) -> () {
    //使用同名的变量接收值,后面使用的值是非控制,不用考虑解包的问题和变量起名的问题,if let 只在{}内有效,guard let只在后面有效
    guard let name = name, let age = age else {return}
    print(name + String(age))
}

解析json的好处

//省去了复杂的if else 的判断
if let jsonDic = json as? NSDictionary,
    let menu = jsonDic["menu"] as? [String: Any],
    let popup = menu["popup"],
    let popupDic = popup as? [String: Any],
    let menuItems = popupDic["menuitem"],
    let menuItemsArr = menuItems as? [Any],
    let item0 = menuItemsArr[0] as? [String: Any],
    let value = item0["value"]
{
    print(value)
}

6.for循环

let range1 = 0..<10
let rang2 = 0...10
//0..<10 代表[0.10)
for i in 0..<10 {
    print(i)
}
//0...10 代表[0.10]
for i in 0...10 {
    print(i)
}
//反转
for i in (0...10).reversed {
    print(i)
}
//数组输出
for i in arr {
    print(i)
}
//数组输出
for (index,value) in arr.enumerated() {
    print(index)
    print(value)
}

7.switch语句case值变化

  • switch可以对任意类型的值进行分支判断
  • 一般不适用break
  • 不在使用多个case的穿透作用,而是使用case “a”,”b” :进行判断
  • 可以使用where筛选语句
var value:(Int,String) = (1,"小明")
switch value {
case let (x,y) where x < 60:
    print("不及格")
default:
    print("及格")
}

8.字符长度,拼接,格式化

let str = "hello word 中国"
//字符串长度,返回字符的个数
print(str.count)
//返回指定编码对应的字节数量 utf8编码(0~4)个,每个汉字是3个字节
print(str.lengthOfBytes(using: .utf8))

let name = "中国"
let age = 65
let rank:String? = "第二名"
let descStr = "\(name)\(age)\(rank ?? "")"

let hh = 12
let mm = 3
let ss = 45

let time = String(format:"%2d:%2d:%2d",hh,mm,ss)

9.数组

//可变数组用var修饰,let修饰不可变数组

//同类数据类型
let arr = [1,2,3] ---> [Int]
//不同类类型
let arr2 = ["avc",1]  ---> [AnyObject]
//其他写法
let arr3 = [Int]()

let arr = [1,2,3]
print(arr)

//下标
for i in 0..<arr.count {
    print(arr[i])
}
//for in
for item in arr {
    print(item)
}
//block
for (index,value) in arr.enumerated() {
    print(index,value)
}
//元组 let e: (offset: Int, element: Int)
for e in arr.enumerated() {
    print("\(e.offset)--\(e.element)")
}
//反向遍历--先枚举在遍历
for e in arr.enumerated().reversed() {
    print("\(e.offset)--\(e.element)")
}

//添加
arr.append(4)
arr[5] = 5

//删除
![这里写图片描述](https://img-blog.youkuaiyun.com/20180515003026584?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2t1YW5nZGFjYWlrdWFuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

//数组合并: 元素必须是同类型才能合并
let view = UIView()
let arr1:[Any] = ["avc",1,view] --> [NSObject]
let arr2:[Any] = [1,3,2]
arr1 + arr2

10.字典

//可变用var修饰,let修饰不可变
//字典中的key必须是唯一的

//let dict: [String : Any]
let dict = ["name":"中古","age":14] as [String : Any]

//let arr: [[String : Any]]
let arr = [
    ["name":"张三","age":14],
    ["name":"李四","age":15]
]

//最常用的类型
//let jsonArr: [[String : Any]]
let jsonArr: [[String: Any]] =  [
    ["name":"张三","age":14],
    ["name":"李四","age":15]
]

//元组遍历
for item in dict (
    print(item.key,item.value)
)
//key,value
for (key,value) in dict (
    print(key,value)
)
//注意
dict1 + dict2是不合法的,只能遍历一个往另一个中添加
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值