最近计划把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学习笔记一的更多相关文章

  1. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  2. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  3. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  4. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  6. swift学习笔记2——函数、闭包

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  7. swift学习笔记1——基础部分

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  8. 记录:swift学习笔记1-2

    swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...

  9. Swift学习笔记(14)--方法

    1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ...

随机推荐

  1. 通过对源代码的反向工程学习CoreData架构

    在本文开始,先给出反向工程后的结果: 不过需要注意,三个实例的指针都被同一个实例拥有,比如三个指针都位于appDelegate. 在AppDelegate类中定义了下面三个属性: @property ...

  2. 【转】linux中waitpid及wait的用法

    原文网址:http://www.2cto.com/os/201203/124851.html wait(等待子进程中断或结束) 表头文件      #include<sys/types.h> ...

  3. iOS - NSLog、UncaughtException日志保存到文件

    转:http://blog.csdn.net/marujunyy/article/details/12005767 对于真机,日志没法保存,不好分析问题.所以有必要将日志保存到应用的Docunment ...

  4. hdu 3172 Virtual Friends(并查集)University of Waterloo Local Contest 2008.09

    题目比较简单,但作为长久不写题之后的热身题还是不错的. 统计每组朋友的朋友圈的大小. 如果a和b是朋友,这个朋友圈的大小为2,如果b和c也是朋友,那么a和c也是朋友,此时这个朋友圈的大小为3. 输入t ...

  5. .net-C#代码判断

    ylbtech-doc:.net-C#代码判断 C#代码判断 1.A,C#代码判断返回顶部 01.{ C#题目}public static void Main(string[] args){     ...

  6. TextView字体和背景图片 设置透明度

    背景图片透明度设置  viewHolder.relative_layout.getBackground().setAlpha(225);     0  ---  225 ((TextView)tv). ...

  7. 基本输入输出系统BIOS---键盘输入

    基本输入输出系统BIOS概述 硬盘操作系统DOS建立在BIOS的基础上,通过BIOS操纵硬件,例如DOS调用BIOS显示I/O程序完成输入显示,调用打印I/O完成打印输出 通常应用程序应该调用DOS提 ...

  8. asmcmd报错

    在进入asm的命令行时报错: 报错内容如下 [oracle@kel dbs]$ asmcmd asmcmd: command disallowed by current instance type 从 ...

  9. MFC图形图像

    一.CDC类 CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户区关联的显示上下文的成员函数.使用CDC的成员函数可以进行所有的 ...

  10. python 常用模块

    1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', 'os2' ...