闲在家里没事,学一下swift。参考的是苹果官网A Swift Tour
https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html
和language guide
后来发现language guide 有中文版的
https://swiftgg.gitbook.io/swift/
像python一样,语句末可以不写;
变量名可以用中文等任何种类符号
Simple Values
用let声明常量,var声明变量,常量和变量都可以先声明再赋值,常量只能赋值一次
声明的时候可以不指定类型也可以指定类型,类型转化必须显式转化
通过\(a)的形式在字符串中插入数字,()内支持简单运算,如\(a+b),实际上a、b可以是任何类型的变量
支持数组[]和字典[:]
Control Flow
if语句,while语句,repeat语句 ,switch语句
支持nil,需要加let
- if let name = optionalName { //let name=optionalName 在optionalName不为nil的时候,取值为真
- greeting = "Hello, \(name)"
- }
case let x where x.hasSuffix("pepper"): //这写法也合适日常英语语法习惯,个人感觉。
感觉swift的语法好丑,0..<4 什么鬼,看到这里都不想看下去了。
函数,对象一般使用和其他语言没大的差别。
20200207
好吧,今天继续看,
这次看的是langugae guide,
基础:
支持各种数据类型,支持数组、集合、字典,比oc多了一个元组,
支持变量和常量,类型安全,支持可选值
示例代码用驼峰式变量命名,变量名支持中文,不能有空格
let 声明常量,var 声明变量
注释用//,/**/
显式类型转化,就算不同的整型也必须显式转化
元组可以用名称或下标访问,_代表忽略这个值
不是可选值类型不能赋值nil
可选值绑定 ,在一个判断语句用支持多个可选值绑定,用逗号隔开
如果确定一个可选值是有值的,可以在变量名后加!,强制展开 //这部分以前没遇到过,不是很明白
错误处理,要放到do声明中,try 加在方法前
断言在debug模式有效,预言precondition在debug和release模式下都有效
//precondition(_:_:file:line:)
这个参数不懂什么意思
基础操作符(运算符)
元组是可比较的
赋值语句不返回值
-a可表示负a,+a其实不进行任何操作
三元运算符?:
空指针合并运算符??
区间运算符 1...4,1..<4, 还可以半开区间...4,2... range是一种数据类型,不是一个数组。
字符串和字符
“”“ 可以开始一段字符,而不是一句字符
\u{24} 代表符号$
字符串前加#,可以避免转义,字符串内的“ ,\n会当成普通符号。
明天继续
20200208
多行字符串,行的末尾加\,可以不换行。
字符串是值类型,字符串不能用int类型的下标直接读取字符,如string[1],会提示错误,字符串的索引是一个类似range类型的专门的index类型
字符串内插用\()
insert(_:at:),方法前的_表示参数的名称可以忽略
string的remove,insert,append,removeRange,hasprefix,hassuffix
从string中截取的一段字符串是substring,substring如果在后面还要用到,建议存到一个新变量中,因为substring只是指向了原来的string。
//unicode编码这块以后再熟悉一下,貌似一下子用不到深入了解
Array(repeating: 0.0, count: 3) 创建一个带初始值的数组,数组可以相加+
collections类型
包含数组、集合、字典
集合可以计算交集intersection(_:)
,symmetricDifference(_:) ,union(_:),subtracting(_:)
集合还有是否子集isSubset(of:)
,isSuperset(of:),isStrictSubset(of:),isStrictSuperset(of:)
,isDisjoint(with:)
字典有updateValue(_:forKey:),removeValue(forKey:) ,keys,values
swift中的函数多个参数间少了,因为用:隔开就可以了,一开始看着不习惯
循环控制
for循环还可以不带变量
- for _ in 1...power {
- answer *= base
- }
for in 基本取代以前的for循环
注意stride(from:to:by:)和stride(from:through:by:)的区别
switch有很多新东西,结构更清晰,支持range,支持元组,元组中还支持(_)
值绑定,A switch
case can name the value or values it matches to temporary constants or variables ,可以获取匹配到的值在当前case中用
switch还支持where运算,以前觉得switch没啥用,现在觉得switch要火
循环控制中还支持label statement,直接退出多层循环
guard语句也挺好的,提高可读性
检查api可用性#available
函数
- func greeting(for person: String) -> String {
- "Hello, " + person + "!"
- }
这里的for 关键字不知道啥作用? for是参数标签,person是参数名,参数标签在调用的时候增加可读性
默认情况下参数标签和参数名一致,带参数标签的函数,在调用时需写清楚参数标签,
(_
) 可以用来设置不需要参数标签。
相同类型的多个参数,可以用可变参数来实现
- func arithmeticMean(_ numbers: Double...) -> Double {
像这样,可以接受多个double类型的函数
参数都是常量类型
inout参数,类似c中的传引用,用&获取地址
函数的类型包括输入类型和输出类型共同组成
var mathFunction: (Int, Int) -> Int = addTwoInts ,这个用法有点牛
所以函数也可以作为参数了
closures,闭包?
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
这里的in 不知道如何理解?
闭包太长,可以用尾随闭包
//闭包回头再看看
枚举
枚举支持联合,支持原始值,原始值默认就是枚举项的名称,也可以是int类型的数值
枚举还可以递归,跳过去了
结构和类,
结构和枚举是值类型,类是引用类型,用===比较两个对象是不是指向同一个实例
建议用struct,除非用到oc采用class