Swift学习笔记一
最近计划把Swift语言系统学习一下,然后将MagViewer用这种新语言重构一次,并且优化一下,这里记录一下Swift的学习笔记。
Swift和Objective-C相比,在语法和书写形式上做了很多改进,面向开发者的体验更好了。比如:
println("Hello, world!")
就可以打印出这个字符串,这条语句就是完整的一句,句末不需要添加分号,也不需要引入额外的头或者库文件比如标准输入输出等。在全局作用域内书写的代码就会作为程序的入口,因此不需要编写main函数了。
简单值
用let声明常量,用var声明变量。常量的值在编译的时候不需要知道,但是必须在某个地方真正给它赋值一次,因此常量通常是在一个地方声明和赋值,在很多地方使用的。
var myVariable =
myVariable =
let myConstant =
常量和变量的类型必须和所赋的值保持一致。但是,并不用每次都显示地写明变量类型,可以只给它们提供值,而让编译器去推测它们的类型。上面的例子就是这样的,也可以显示地写明类型:
let explicitDouble: Double =
变量不会隐式地进行类型转换,如果需要类型转换,必须要开发者显示地进行,比如:
let label = "The width is "
let width =
let widthLabel = label + String(width)
在字符串中引用变量还有更简单的方式,就是直接用反斜杠加上圆括号就可以了,比如:
let apples =
let oranges =
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
创建数组和字典是用中括号,获取数组或字典的值也是。
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[] = "bottle of water" var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
创建空数组或空字典时,用初始化语法更为简便:
let emptyArray = [String]()
let emptyDictionary = [String: Float]()
如果元素类型能够被推理出来,甚至可以省略类型声明,用[]表示空数组,[:]表示空字典,比如:
shoppingList = []
occupations = [:]
控制流
用if和switch做条件选择,用for-in,for,while,do-while做循环,选择条件的圆括号和循环变量是可以省略的,但是主体部分的大括号不能省略:
let individualScores = [, , , , ]
var teamScore =
for score in individualScores {
if score > {
teamScore +=
} else {
teamScore +=
}
}
println(teamScore)
在if结构中,条件语句的值必须是一个Boolean表达式,这就使得上面的例子中if score {。。。}无法通过,而不是将score值隐式地转换了。
if和let可以结合使用,这样可以避免找不到该变量。这种变量相当于可省略的,可省略的变量要么等于某个值,要么就是nil(未找到该变量),在变量类型之后加上一个?来标明该变量是可省略的:
var optionalString: String? = "Hello"
println(optionalString == nil) var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
switch支持任何数据类型以及很多种条件比较表达式(并不限定为整数或者判断是否相等):
let vegetable = "red pepper"
switch vegetable {
case "celery":
let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
let vegetableComment = "Is it a spicy \(x)?"
default:
let vegetableComment = "Everything tastes good in soup."
}
//Is it a spicy red pepper?
default分支是必须的,否则编译会报错。
注意是如何用let将满足一个表达式的值赋给一个常量的。
在进入合适的case之后,程序会跳出switch块,忽略其他case,因此不需要在每个case最后都加上break;
用for in来遍历数组或字典,数组是按顺序排列的,而字典则是随机排列的键值对。
let interestingNumbers = [
"Prime": [, , , , , ],
"Fibonacci": [, , , , , ],
"Square": [, , , , ],
]
var largest =
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
println(largest)
white和do-while用来做循环:
var n =
while n < {
n = n *
}
println(n) var m =
do {
m = m *
} while m <
println(m)
当然,在循环体中可以引用当前的index,要么用..<来创建index的范围,或者显示地声明初始值,条件语句和递增量,这两种方法是完全等价的:
var firstForLoop =
for i in ..< {
firstForLoop += i
}
println(firstForLoop) var secondForLoop =
for var i = ; i < ; ++i {
secondForLoop += i
}
println(secondForLoop)
..<不包含范围的最大值,而...包含范围的最大值和最小值
函数和闭包
用func来声明函数,用->来标明函数的返回值:
func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")
用元组来构建复合值。比如,从一个函数返回多个值。元组的元素可以用名称或者数字索引:
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
    var min = scores[]
    var max = scores[]
    var sum = 
    for score in scores {
        if score > max {
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }
    return (min, max, sum)
}
let statistics = calculateStatistics([, , , , ])
println(statistics.sum)
println(statistics.)
函数也可以接受不定个数的变量,把它们全部包含进一个数组,比如:
func sumOf(numbers: Int...) -> Int {
    var sum =
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(, , )
函数是可以嵌套的,内部函数可以访问外部函数的变量(JS中的闭包)
func returnFifteen() -> Int {
    var y =
    func add() {
        y +=
    }
    add()
    return y
}
returnFifteen()
函数本身也可以作为返回值被外部函数返回或者作为参数被传递:
func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return  + number
    }
    return addOne
}
var increment = makeIncrementer()
increment()
func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number <
}
var numbers = [, , , ]
hasAnyMatches(numbers, lessThanTen)
函数其实是闭包的一种特殊情况而已:就是可以在程序的其他地方被调用的代码块。闭包里的代码可以访问闭包被创建时所在的作用域链上的变量或者函数,不管闭包在执行的时候是在哪个作用域,嵌套函数就很好地说明这个问题了。
编写匿名闭包可以通过将代码包含在大括号里边,用in将参数序列及返回值和函数体分开:
numbers.map({
    (number: Int) -> Int in
    let result =  * number
    return result
})
闭包可以写得更简洁,如果闭包的类型是已知的,比如某个代理的回调,则可以省略它的参数类型和返回值类型。
let mappedNumbers = numbers.map({ number in  * number })
println(mappedNumbers)
变量的引用也可以用数字而非名字,这在短闭包中非常有用。被作为最后一个参数传递给函数的闭包可以直接在圆括号之后出现:
let sortedNumbers = sorted(numbers) { $ > $ }
println(sortedNumbers)
这一篇就到这里吧,接下来就要接触到类相关的语法了。
Swift学习笔记一的更多相关文章
- 【swift学习笔记】二.页面转跳数据回传
		上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ... 
- Swift学习笔记(一)搭配环境以及代码运行成功
		原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ... 
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
		之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ... 
- swift学习笔记4——扩展、协议
		之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ... 
- swift学习笔记3——类、结构体、枚举
		之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ... 
- swift学习笔记2——函数、闭包
		之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ... 
- swift学习笔记1——基础部分
		之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ... 
- 记录:swift学习笔记1-2
		swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ... 
- Swift学习笔记(14)--方法
		1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ... 
随机推荐
- memcached 最大连接数及其内存大小的设置
			memcached的基本设置: -p 监听的端口-l 连接的IP地址, 默认是本机-d start 启动memcached服务-d restart 重起memcached服务-d stop|shutd ... 
- Android 仿百度网页音乐播放器圆形图片转圈播放效果
			百度网页音乐播放器的效果 如下 : http://www.baidu.com/baidu?word=%E4%B8%80%E7%9B%B4%E5%BE%88%E5%AE%89%E9%9D%99& ... 
- MySQL基础之第4章 MySQL数据类型
			4.1.整数类型 tinyint(4)smallint(6)mediumint(9)int(11)bigint(20) 注意:后面的是默认显示宽度,以int为例,占用的存储字节数是4个,即4*8=32 ... 
- IE8按F12不显示开发人员工具窗口
			转:http://www.cnblogs.com/micromouse/archive/2010/07/11/1775174.html 网上搜来的,记录一下,免得以后忘了 F12将开发人员工具启动后, ... 
- Dapper.net 在Parameterized时对于String的扩展(转)
			虽然Dapper通过提供的DbString本身支持对于String的指定Parameterized,但这方法明显不够,当Insert时,我们更希望是把一个Poco直接传递过去,而不是来new一个匿名函 ... 
- 仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)
			转载请说明原出处,谢谢 今天本来打算把仿酷狗播放列表的子控件拖动插入功能做一下,但是仔细使用播放列表控件时发现了几个逻辑错误,由于我的播放 列表控件是基于CTreeViewUI和CTreeNodeUI ... 
- bzoj 3675 [Apio2014]序列分割(斜率DP)
			[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3675 [题意] 将n个数的序列分割k次,每次的利益为分割后两部分数值和的积,求最大利益 ... 
- AtCoder Grand Contest 001
			B - Mysterious Light 题意:从一个正三角形边上一点出发,遇到边和已走过的边则反弹,问最终路径长度 思路:GCD 数据爆long long #pragma comment(linke ... 
- Javascript手记-基本类型和引用类型
			1:ecmascript包含2中不同的数据类型,基本数值类型和引用数值类型.基本数据类型是简单的数据段,引用类型是指那些可能由多个值构成的对象. 1.1:常用的基本类型:Undefined,Null, ... 
- dfs.datanode.max.xcievers参数导致hbase集群报错
			2013/08/09 转发自http://bkeep.blog.163.com/blog/static/123414290201272644422987/ [案例]dfs.datanode.max.x ... 
