注:使用xcode6,启用调试bug提示输入密码,可在终端输入DevToolsSecurity -enable 解决
//========================
//2014/7/18 11:06
//========================
1、简单值(值类型同java中的类型对象:String,Double,Float,Int(Integer)…),新增了了两个有用的集合类型 Array和Dictionary
let声明常量,var声明变量。(常量只能赋值一次,例如:圆周率π=3.14是个常量,声明圆周率:let PI = 3.14)
let和var声明的值,不用显式的指定值的类型,编译器会在编译的时候根据值的特征去推断指定的类型值
当然也可以显式指定值的类型,如 let a: Double = 70 var b: Float = 4
值不会隐式转换成其它类型,若要转换成其它类型需要进行强转,如
let label = “the width is”
let width = 95
let widthlabel = label + String(width)
(),可以将括号中的值转换成字符串,在双引号中使用 ,在playground中,输入 var a:String = “(3+5)” + String(6) 将输出 86
数组和字典的定义:
var array = ["a","b"]
var dict = ["a":1,"b":2]
dict["c"] = 3 //新增数据字典项
定义空数组和字典
var array = String[]() var dict = Dictionary<String, T>
然后根据相关的api函数添加数据项
2、控制流
if、switch做条件控制,for-in、for、while、do-while做循环控制
if
let scores = [75,43,103,87,12]
var teamScore = 0
for score in scores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
switch
swift的switch的条件与java不同,swift不限制值的类型,其次是swift的switch运行遇到匹配的就会退出,而java需要手动的使用break退出
let vegetable = "red pepper"
switch vegetable {
case "celery":
let vegetableComment = "Add some raisins"
case "cucumber", "watercress"
let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("papper"):
let vegetableComment = "Is it a spicy \(x)?"
default:
let vegetableComment = "Everything tastes good in soup."
}
针对数据字典(dictionary)循环遍历 swift提供了特殊的处理方式:在for后面用一组值代替 key-value
let dict = ["Prime":[2,3,5,7,11,13],"Fibonacci":[1,1,2,3,5,8],"Square":[1,4,9,16,25]]
var largest = 0
for (kind, numbers) in dict {
for number in numbers {
largest = number
}
}
largest//输出25
while和do-while循环,基本与java的while和do-while类似,除了条件swift不需要括号,而java需要用括号
for循环,有三种写法 1> for i in array 2> for i in 0..10 3> for i = 0; i < 10; ++i (有点类似Oracle的 for..in.. loop)
注:操作符与前后需要有空格,不然编译会不通过
3、函数和闭包
swift的函数使用func声明,使用 “->” 声明函数的返回值类型,这一点在语法上与java的方法有很多的差别,还是很容易理解,还有更特殊的一点,
swift的函数可以返回一组值,如:
func getGasPrices() -> (Double, Double, Double) {
return (3.0, 4.0, 5.0)
}
getGasPrices()
swift的函数参数和java的方法参数一样,可以使用 …表示该函数有多个参数(几个参数在函数里用数组处理)
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
}
嵌套函数(在函数体内声明的函数是嵌套函数),嵌套函数可以访问被嵌套函数的变量
func returnFifteen() -> Int {
var y = 10
func add() { //嵌套函数
y += 5
}
add()
return y
}
函数是一个很好的类型,这就意味着,函数可以作为其它函数的返回值
func makeIncrementr() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
同理函数也可以作为其它函数的参数
fucn 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 < 10
}
var numbers = [20,19,7,12]
hasAnyMatches(numbers, lessThanTen)
函数是一种特使的闭包,下面例子是使用函数闭包给numbers的每一项*3倍
numbers.map({
(number:Int) -> Int in
let result = 3 * number
return result
})
如果闭包的类型是已知的,则可以隐藏掉参数的类型或者返回值的类型
numbers.map({
number in 3 * number }) // 与上面的写法等价
可以使用参数的下标值替代参数的名字,给参数赋值。当一个闭包作为最后一个参数传给一个函数的时候,它可以直接跟在括号后面。
sort([1,5,3,12,2]){ $0 > $1 } // 输出 12,5,3,2,1
sort([1,5,3,12,2]){ $0 < $1 } //输出 1,2,3,5,12
4、对象和类
对象和类的概念与java相同,但使用方式有很大的区别,java是使用new实例化对象,而swift采取调用类似于函数的方式实例化对象
比如:创建空字符串
java:
String javaStr = new String();
swift:
var swiftString = String()
swift类的初始化函数为 init
class Shape {
var type = String()
init(type:String) {
self.type = type
}
}
还有其它地方 n多区别,待以后慢慢发现
struct 与 class的区别:struct能支持和包含class的各种特征,唯一一个区别的地方是,struct是传值,而class是传引用
附上,中文《The Swift Programming Language》
PS: vmware mac os下 xcode6,老是崩溃,期待正式版快快出来。