Swift 语言学习笔记_1
About me: 在学习Swift之前完完全全的零基础编程,不知道变量与常量区别的那种零基础。
教程主要看 http://www.runoob.com/swift/swift-environment.html 和官方文档的原版对比着看https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html 我写下来的笔记一般都是上述教程没有说明的,需要自己去查的。
其它参考:swift官方网站:https://swift.org/
2017-2-19
```
import UIKit //想创建IOS playground,需要引入import UIKit
var str = "Hello,playground" //第一行程序
print(str)
print("hello,Youngxkk")
/*print是输出显示打印的意思,标记是:单词,符号。tips:需要加上双引号的情况是指要打印的字符串不是来自变量或者常量,也不涉及到其他代码的字符串。不用加双引号的情形是打印某个变量*/
"hello,world" //是字符串,是字符的序列集合,多个字母单词
"a"//是字符,也就是指的单个字母
```
//常量的命名可以由字母数字和下划线组成。
```
let _name = "youngxkk"
print(_name)
let 你好 = "hello or hi"
print(你好)
let name = "Youngxkkk"
let site = "www.youngxkk.com"
print("\(name)的网站地址是:\(site)")
```
//变量声明,在使用变量声名前,你需要使用var关键字声明它,如下
var meaningOfLife = 42 //变量命名
print(meaningOfLife) //变量输出
var youngxkk = "百科小王子" //变量命名
print(youngxkk) //变量输出
print("youngxkk,u r god\(meaningOfLifetest)") //变量输出
//标识符号:区分大小写MY与my是两上不同的标识符。
//swif字面量,直接了当的指出自己的类型并为亦是进行赋值的值
42 //整数形
3.14159 //浮点型
"hello" //字符串型
true //布尔型,英文=bool , 类似设计工具中的布尔运算,但又不完全相同,
//swift有两个布尔值bool的类型。也就是两个布尔常量,true和false,也就是他们只能是真或是假。通俗的讲就是非黑即白
/*Swift的可选(Optionals)类型,用于处理值缺失的情况,表示那儿有一个值"x"或者那儿没有值,
swift定义"?",问号作为命名类型Optional的简写*/
var optionalInteger: Int?
va roptionalInteger: Optional<Int> //这一行不知为啥会报错,至少没解决???
//如果一个可选类型的实例包含一个值,可以在其后面加上后缀操作符"!"来访问这个值
OptionalInteger = 42
OptionalInteger!
let maxumumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
//常量,最大登录次数,变量,已经登录次数
var x = 0.0,Y = 0.0,Z = 0.0
//声名多个变量,逗号隔开。
var a = 2,b = 3,c = 4
print(a)
print(x)
var welcomeMessage: String
//欢迎提示的字符串,声明一个类型为string,名字为welcomeMessage的变量。
//welcome的变量“string”可以设置成任意字符串
welcomeMessage = "hello,world"
var iloveyou: String
iloveyou = "young"
print(iloveyou)
var red,green,blue: Double
//一行中类型的多个变量,逗号分割,最后一个变量名之后添加冒号和类型标注
let π = 3.1415926
let你好啊= "hello,world"
/*常量和变量的命名,常量或者变量声明为确定的类型后,不可使用相同的名子在次声明,或改变存储的类型,常量与变量不可互转。
但可以改变现有的变量值为其它同类型的值如下方*/
let constB:Float = 3.24232221
//常量后面的冒号和Float是类型标注
var friendlyWelcome = "hello!"
friendlyWelcome = "bonjour!"
//此时,friendlyWelcome输出的值是"bonjour!",常量值(let)不可以更改
print(welcomeMessage)
print("weilcome to my country \(welcomeMessage)")
//使用双引号和括号前加反斜杠,可以将常量或变量转义
let cat = "animal";print(cat)
//同一行中有多条独立语句时,使用分号区分
print(cat)
let minValue = UInt8.min
//minValue为0,是UInt8类型
let maxValue = UInt8.max
//maxValue为255,是UInt8类型
//double表示64位浮点数,精度很高,有15位,Float表示32位浮点数,只有6位。
let meaningOfLife = 42
//meaningOfLife会被推测为Int类型,整数类型。打印的时候提示框中显示了int
print(meaningOfLife)
let pi = 3.1415926
//pi会被推测为Double类型,下一行打码打印的时候弹窗提示框提示了Double
print(pi)
let anotherPi = 3 + 0.1415926
print(anotherPi)
/*anotherPi会被推测为Double类型
因为当表达示中同时出现整数和浮点数,会被推断为Double类型*/
/*
以上所了解的,提到了基本的数据类型,包括整数int,浮点数Double和Float,布尔类型Bool以及字符串类型String,此外Swift还提供了其它更强大的数据类型:Optional,Array,Dictionaty,Struct,Clsaa等
*/
//String型字面量,是由("")包含在内的广西字符集,如下
let wisewords = "\"我是百科小王子\" -"
let dollarsign = "\u{24}"
let blackheart = " \u{2665}"
//这里遇到一个问题,swift2.1及之前的版本都没有在24外面加上{}符号,所以编译一直出错,看了官方的3.0英文原版文档加是{}才正常。
/*
顺便记一下转义字符及含义\0空字符,\b退格,\f换页,\n换行,
\r回车,\t水平制表,\v垂直制表,重要的点\'是单引号,\"是双引号
下面尝试一下空格及换行
*/
let StringLiterals = "helloworld\n\n欢迎来查看我的swift学习笔记:\'www.youngxkk.com\'"
print(StringLiterals)
//算术运算符
var A = 10
var B = 20
print(A + B)
print("A - B = \(A - B)")
//比较运算符
print(A == B)//==是等于的意思
print(A != B)//!=是不等于的意思
print(A > B)//>是大于的意思
print(A <= B)//<=是小于或等于的意思,因为结果为true
/*逻辑运算符,下主是三个主要说明
&&逻辑于。如何运算符两侧都为TRUE则为TRUE
||逻辑或。如果运算符两侧至少有一个为TRUE则为TRUE
!逻辑非。布尔值取反,可以全true变false,使flase变为true
*/
var C = true
var D = false
print("C && D结果为:\(C && D)")
print("C || D结果为:\(C || D)")
print(!C)
print(!D)
//位运算符号用来对二进制进行操作
//赋值运算
var f = 10
var g = 20
var h = 100
h = h + 10//他的本意是本身的值在加上10,然后赋值给本身,为了简化,这个代码也可以写成h+=10
h = f + g
print("h结果为:\(h)")
//h是变量,不可以是常量,
h += g
print("h结果为:\(h)")//相当于h=h+g
h -= f
print("h结果为:\(h)")//相当于h=h-f
h *= g
print("h结果为:\(h)")//相当于h=h*g
h /= f
print("h结果为:\(h)")
//区间运算符
print("区间运算符1到5")
for index in 1...5 {
print("\(index)* 5 = \(index * 5)")
}
print("闭区间运算符1之后,小于5")
for index in 1..<5 {
print("\(index)* 5 = \(index * 5)")
}
//其它运算符号
var j = 10
var k = 20
var l = true
var m = false
print("j+k= \(j + k)")
print("k-j= \(k - j)")
print("三元运算:\(l?j : k)")
print("三元运算:\(m?j : k)")
//三元运算符条件是"?x:y",引号内的部分,如果添加为treue,值为x,否则为y
/*1,运算符的优先级,指针最优先,单目运算优于双目运算,例如正负号
2,先乘除(模),后加减
3,先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7等价于(1 <<(3 + 2))&7
4,逻辑运算最后计算
3和4暂时不懂,需要在查资料
*/
var n = 0
n = 2 + 3 * 4 / 6
print(n)
//上面表达示算法是3先乘以4在除6在加2等于4
/*条件语句
if语句:"由一个布尔表达式和一个或多个执行语句组成"
内嵌if语句:"你可以在if或else if中内嵌if或else if语句。"
switch语句:" switch语句允许测试一个变量等于多个值时的情况。"
*/
var ab = 10//检测条件
if ab < 20 {//如果条件语句为true,执行以下程序,if语句要带{}这种扩号
print("ab小于20")
}
print("ab的变量值为\(ab)")
//if...else :"else语句在布尔表达式为false时执行"
var bc:Int = 30
if bc > 100 {
print("bc大于100")
}else{
print("bc小于100")
}
print("bc的变量为\(ab)")
/*if...else if...else语句:"if后可以有可选的else if...else语句,else if...else语句常用于多个条件判断。"
*/
var cd = 100
if cd == 20 {
print("cd的值等于20");
} else if cd == 50 {
print("cd的值等于50");
} else {
print("没有匹配的条件");
}
print("cd的值等于\(cd)")
//switch语句的解释:switch就像是路由器,收到一个变量在去决定进行不同的操作,如果情况是1,那么值就是1,那就是case1。fallthrough,为连续运行的意思,因为swift默认不执行下去,其它的语言需要要case后面紧跟break,用break终止运行。
var abc = 10
switch abc{
case 100 :
print("abc的值为100")
case 10,20 :
print("abc的值为10或20")
case 50 :
print("abc的值为50")
default :
print("默认case")
}
print("abc的值为\(abc)")
//下面的实例使用fallthrough
var az = 100
switch az {
case 50 :
print("az的值为50")
fallthrough
case 100,200 :
print("az的值为100或200")
fallthrough
case 20 :
print("az的值为20")
default :
print("默认case")
}
//swift for循环
var someInts:[Int]=[10,20,30]
for index in 0 ..< 3
{
print("索引[\(index)]对应的值为\(someInts[index])")
}
//swift字符串
var StringA = ""
if StringA.isEmpty {
print("String是空的")
}else{
print("String不是空的")
}
var StringB = String()
if StringB.isEmpty {
print("StringB是空的")
}else{
print("String不是空的")
}
/*
Swift支持以下几种字符串函数及运算符,函数/运算符&描述
1
isEmpty
判断字符串是否为空,返回布尔值
2
hasPrefix(prefix: String)
检查字符串是否拥有特定前缀
3
hasSuffix(suffix: String)
检查字符串是否拥有特定后缀。
4
Int(String)
转换字符串数字为整型。实例:
let myString: String = "256"
let myInt: Int?= Int(myString)
5
String.characters.count
计算字符串的长度
6
utf8
您可以通过遍历String的utf8属性来访问它的UTF-8编码
7
utf16
您可以通过遍历String的utf8属性来访问它的UTF-16编码
8
unicodeScalars
您可以通过遍历String值的unicodeScalars属性来访问它的Unicode标量编码.
9
+
连接两个字符串,并返回一个新的字符串
10
+=
连接操作符两边的字符串并将新字符串赋值给左边的操作符变量
11
==
判断两个字符串是否相等
12
<
比较两个字符串,对两个字符串的字母逐一比较。
13
!=
比较两个字符串是否不相等。
*/
//字符串中插入值
var varA = 10
let letB = 20
var varC = 40
var varD = varA * letB - varC
var varE = "\(varA)+ \(letB)- \(varC)"
print(varD)
print(varE)
//字符串可以通过+号来连接
let name2 = "youngxkk"
let hi2 = "hellomike"
var String2 = hi2 + name2
print(String2)
//字符串长度使用String.characters.count属性来计算,如下
print("\(String2)的长度为\(String2.characters.count)")
//?:运算符
//条件运算符号?:可以用来代替if...else语句,他的一般形式如下:
(myString != nil)?myString : myString;
//myString是表达式,原文的“Exp1?Exp2 : Exp3;”报错,所以尝试了myString,
/*其中,Exp1、Exp2和Exp3是表达式。请注意,冒号的使用和位置。
?表达式的值是由Exp1决定的。如果Exp1为真,则计算Exp2的值,结果即为整个?表达式的值。如果Exp1为假,则计算Exp3的值,结果即为整个?表达式的值。
这个地方不理解,需要查资料
*/
let decimalInteger = 23
let binaryInteger = 0b10001
let octalInteger = 0o21
let hexadecimalInteger = 0x11
let maxInt8: Int8 = Int8.max
let minInt32: Int32 = Int32.min
let twoThousand: UInt16 = 2000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
//UInt8和UInt16是两个类型,不能直接相加,可以调用
let integerPi = Int(pi)
/*integerPi等于3,所以被推测为Int类型,
当然使用此方法浮点数会被截断,小数点后面的都没了*/
//类型别名
typealias AudioSample = UInt16
//定义好类型别名后,可以在使用使用原始名的地方使用别名
var maxAmplitudeFound = AudioSample.min
//maxAmplitudeFound现在是0
//布尔值,只有两个true or false
let orangesAreOrange = true
let turnipsAreDelicious = false
//下方是非常无比重要的条件语句:if语句,布尔值非常有用
if turnipsAreDelicious {
print("mum,tasty turnips")
}else{
print("Eww,turnips are horrible.")
}
//输出“Eww.turnips are horrible.”
//下方是控制流使用for ..in ...语法
for index in 1...6{
print("\(index)times 6 is \(index * 2)")
}
let names =["mike","young","jack","mianmian"]
for name in names {
print("hello,\(names)")
}
//tuples元组把多个值组合成一个复合值,内可以是任何类型
let http404error =(404,"not found")
//一个类型为(Int,String)的元组
let(statusCode,statusMessage)= http404error
print("The status code is \(statusCode)")
print("the statusMessage is \(statusMessage)")
//元组的内容被分解成单独的常量和变量
print("The status code is \(http404error.0)")
print("the status message is \(http404error.1)")
let http200Status =(statusCode: 200,description: "ok")
print("The Status code is \(statusCode)")
print("The Status code is \(http200Status.description)")
//可以用元组中的命名,也可以用.0和.1来表示函数返回值
//可选类型
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
var serverResponseCode: Int?= 404
//serverResponseCode包含一个可选的Int值404
serverResponseCode = nil
var surveyAnswer: String?
/*Swift的nil和Objective-C中的nil并不一样。在Objective-C中,nil是一个指向不存在对象的指针。在Swift中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。*/
//if语句以及强制解析
//下方是获取设备信息及打印出来
let mainBundle = NSBundle.mainBundle()
let identifier = mainBundle.bundleIdentifier
let info= mainBundle.infoDictionary
let bundleId= mainBundle.objectForInfoDictionaryKey("CFbundleName")
let version= mainBundle.objectForInfoDictionaryKey("CFBundleShortVersionString")
print("identifier:\(identifier)")
print("bundleId:\(bundleId)")
print("version:\(version)")
print("info:\(info)")
//在statues bar上显示风火轮效果
UIApplication.sharedApplication().networkActivityIndicatorVisible = true;
var dic =[0:4,1:5,2:6,3:7]
var newDic = dic
//check dic and newdic
dic[0]= 8
dic
newDic
/*集合类型(Collection Types)
Swift语言提供Arrays、Sets和Dictionaries三种基本的集合类型用来存储集合数据。数组(Arrays)是有序数据的集。集合(Sets)是无序无重复数据的集。字典(Dictionaries)是无序的键值对的集。
*/
//arr是数组,dict是词典
var array =[1,2,3,"hello","world",youngxkk,5,"6"]//其中的youngxkk为变量
array[2]
array[4]
array[7]
array[5]//多0开始,其中的第6个,是youngxkk,自动显示字符串
//字典类型快捷语法Swift的字典使用Dictionary定义,其中Key是字典中键的数据类型,Value是字典中对应于这些键所存储值的数据类型。
var dict =[10:"m",20:"i",30:"k",40:"e","mike":9]
dict[10]
dict[30]
dict["mike"]
//:-----------分割线------------,尝试一下HASH值,看有什么区别
CFHash("world")
CFHash(30)
//创建数组,使用构造语法来创建一个由特定数据类型构成的空数组
var someArray =[1,"hello"]
print(1)
let emptyArray =[String]()
let emptyDictionary =[String: Float]()
//创建一个带有默认值的数组
var FourDoubles =[Double](count: 4,repeatedValue: 0.0)
//FourDoubles是一种[Double]数组,等价于[0.0,0.0,0.0]
//通过两个数组相加创建一个数组
var anotherFourDoubles =[Double](count: 4,repeatedValue: 2.5)
//anotherFourDoubles被推断为[Double],等价于[2.5,2.5,2.5]
var eightDoubles = FourDoubles + anotherFourDoubles
//eightDoubles被推断为[Double],等价于[0,0,0,0,2.5,2.5,2.5]
//字面量构造数组
var shoppingList:[String]=["eggs","fruits"]
/*shoppoingLisr已经被构造,并且包含两个初始项。
shoppingList数组被声明为变量(var)而不是常量(let),是因为以后可能会加入更多数据*/
//访问和修改数组(这个数组有2个项)
print("the shoppingList contains\(shoppingList.count)items.")
//可以使用布尔值属性isEmpty作为检查count的属性是否为0的捷径
if shoppingList.isEmpty{
print("shoppingList is empty")
}else{
print("shoppinglist is not empty")}
//也可以使用append(_:)的方法在数组后面添加新的数据项
shoppingList .append("flour")
shoppingList.append("apple")
//除此之外,还可以使用加法赋值运算符+=直接在后面添加一个或多个数据项
shoppingList +=["water","music"]
//下面尝试一下使用下标语法来获取数据项,索引要放在中括号中
var secondItem = shoppingList[1]
//也可以使用下标来改变某个索引值对应的数据项
shoppingList[2]= "orange"
shoppingList[3...5]=["bananas","cook","coca"]
print(shoppingList)
//我们可以使用for-in循环来遍历数组中的数据项
for items in shoppingList{
print(items)
}
//Sets集合是指无序无重复数据的集
//创建一个空的集合
var letters = Set()
print("letters is of type Set with \(letters.count)items.")
//打印"letters is of type Set with 0 items."通过构造器,这里的letters变量的类型被推断为Set。
var favoriteGenres: Set =["Rock","Classical","hiphop"]
/*例子创建一个称之为favoriteGenres的集合来存储String类型的值:这个favoriteGenres变量被声明为“一个String值的集合”,写为Set。由于这个特定的集合含有指定String类型的值,所以它只允许存储String类型值。这里的favoriteGenres变量有三个String类型的初始值("Rock","Classical"和"Hip hop"),并以数组字面量的方式出现。
*/
//集合操作你可以高效地完成Set的一些基本操作,比如把两个集合组合到一起,判断两个集合共有元素,或者判断两个集合是否全包含,部分包含或者不相交.
let oddDigits: Set =[1,3,5,7,9]
let evenDigits: Set =[0,2,4,6,8]
let singleDigitPrimeNumbers: Set =[2,3,5,7]
oddDigits.union(evenDigits).sort()
//[0,1,2,3,4,5,6,7,8,9]都包含
oddDigits.intersect(evenDigits).sort()
//[]交集之内
oddDigits.subtract(singleDigitPrimeNumbers).sort()
//[1,9]不在B里面的,只要A里面。
oddDigits.exclusiveOr(singleDigitPrimeNumbers).sort()
//[1,2,9]交集之外
//While循环
/*while循环从计算单一条件开始。如果条件为true,会重复运行一系列语句,直到条件变为false。
下方是一个爬格子的游戏,有梯子和小蛇*/
let finalSquare = 25
var board =[Int](count: finalSquare + 1,repeatedValue: 0)
board[03]= +08;board[10]= +02;board[06]= +11;board[09]= +09;
board[14]= -10;board[19]= -11;board[22]= -02;board[24]= -08;
var square = 0
var diceRoll = 0
while square < finalSquare {
//掷骰子(diceRool)
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
//根据点数移动
square += diceRoll
if square < board.count {
//如果玩家还在棋盘上,顺着梯子上去或者蛇滑下
square += board[square]
}
}
print("game over!")
//下方是Repeat-While循环,finalsquare,board,square,diceRoll初始化值和while值相同
/*
repeat {
//顺着梯子爬上去或者顺着蛇下来
square += board[square]*此处报错,不知道为什么,暂时注销*
//掷骰子
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
//根据点数移动
square += diceRoll
}while square < finalSquare
print("game over!")
*/
//条件语句,if语句,适用于简单的条件
var temperature = 39
if temperature < 40 {
print("the temperature is cold")
}
if temperature < 32 {
print("the temperature is very cole")
}else if temperature >= 39 {
print("the temperature is normal= 39")
}
//Switch语句,更适用于条件较复杂、可能情况较多且需要用到模式匹配(pattern-matching)
/*switch some value to consider {
case value 1:
respond to value 1
case value 2,
value 3:
repond to value 2 or value 3
dafault:
otherwise,do something else
}
*/
let someCharacter: Character = "e"
switch someCharacter {
case "a","e","o","u":
print("\(someCharacter)is a vowel")
case "b","n","v","p","i","t","r","c":
print("\(someCharacter)is a consonant")
default:
print("\(someCharacter)is not a vowel or a consonant")
}
//switch和case的一些注意点,一个case可以包含多个模式,中间用逗号分开,冒号结尾:
//case的分支的模式也可以是一个值的区间。
let approximateCount = 99
let countedThing = "moons orbiting Saturn"
var naturalCount: String
switch approximateCount {
case 0:
naturalCount = "no"
case 1..<5:
naturalCount = "a few"
case 5..<12:
naturalCount = "several"
case 12..<100:
naturalCount = "dozens of"
case 100..<1000:
naturalCount = "hundreds of"
default:
naturalCount = "many"
}
print("there are \(naturalCount)\(countedThing)")
//输出"There are dozens of moons orbiting Saturn."
//元组(Tuple)
let somePoint =(1,1)
switch somePoint {
case(0,0):
print("(0,0)is at the origin")
case(_,0):
print("(\(somePoint.0),0)is on the x-axis")
case(0,_):
print("(0,\(somePoint.1))is on the y-axis")
case(-2...2,-2...2):
print("(\(somePoint.0),\(somePoint.1))is inside the box")
default:
print("(\(somePoint.0),\(somePoint.1))is outside of the box")
}
//输出"(1,1)is inside the box"
//字典重复学习
var someDict:[Int:String]=[1:"one",2:"two",3:"three"]
print(someDict[1])
var someVar = someDict[1]
print("key2的值为is \(someDict[2])")
print("key1的值为\(someVar)")
//函数(重点)
func sayHello(person: String)-> String {
let greeting = "Hello," + person + "!"
return greeting
}
print(sayHello("mike"))
/*重要的解释
调用sayHello(_:)函数时,在圆括号中传给它一个String类型的实参,例如sayHello("Anna")。因为这个函数返回一个String类型的值,sayHello可以被包含在print(_:separator:terminator:)的调用中,用来输出这个函数的返回值,正如上面所示。
在sayHello(_:)的函数体中,先定义了一个新的名为greeting的String常量,同时,把对personName的问候消息赋值给了greeting。然后用return关键字把这个问候返回出去。一旦return greeting被调用,该函数结束它的执行并返回greeting的当前值。
你可以用不同的输入值多次调用sayHello(_:)。上面的例子展示的是用"Anna"和"Brian"调用的结果,该函数分别返回了不同的结果。
为了简化这个函数的定义,可以将问候消息的创建和返回写成一句:
*/
func sayHelloAgain(person: String)-> String {
return "hello Again," + person + "!"
}
print(sayHelloAgain("Youngxkk"))
//函数也可以有无参函数,例如下面这个
func sayhelloworld()-> String {
return "hello,wrold"
}
print(sayhelloworld())
//无返回值函数
func saygoodbye(personName: String){
print("goodBye,\(personName)")
}
saygoodbye("Youngxkkk")
```