ios 8 发布后的一个初探swift语言的学习笔记(基本数据类型)

来源:互联网 发布:oracle需要使用的端口 编辑:程序博客网 时间:2024/04/30 08:25

3号,端午刚过,回到公司第一个早上的两小时便贡献给了apple的ios 8 发布会,在看完后,感觉操作系统越来越离我们的生活更近了,更多的应用支持了人们的日常生活,健康,娱乐,旅游等领域,相信以后的生活也更加人工智能化,在发布会的最后,提到了swift的全新开发语言,据发布会上的介绍,更新安全,快捷,编码高效。因此也对此进行了第一阶段的初探与学习。

语言语法笔记:

1.常量和变量的定义。

常量使用let 进行约束, 变量使用var来约束,相信大家对var并不陌生,如早期的VB, pascal,js等都会有这样的定义。但根据书中介绍,swift对常量,和变量的约束,编译更加精确,有时候用户可以不需要声明某个常量是什么类型,像通常 声明一个变量 int  b = 0; 而 在swift中使用var b=0 即可,swift可根据初始化的值进行判断是变量是什么类型,如果var 中没有指定足够的信息(当然是机算判断变量类型的信息时,)可以使用分号进行加以说明,如书中的例子:

let implicitInteger = 70             //会自动识别为integer
let implicitDouble = 70.0
let explicitDouble: Double = 70    //加上类型说明

变量的声明与使用

var myVariable = 42
myVariable = 50
var explicitVariable:Double = 60

2.字符串串接及类型转换

大家可能用OC都有一个想骂人的串接问题,如 在nsstring *a = "hello" 串接 " world",常常使用stringbyappendstring ,或使用stringWithFormat:"%@,%@" 来串接,有没有?而不能使用"+"操作符。真难过,实在难过,特别是对于C/C++,PASCAL,JAVA 甚至更多高级语言都是支持“+”号操作符。唯有OC特别,搞得我一个同事说,想学习一下IOS,但语言太另类了,其实啥语言都大差不差,习惯就好。现在好了,swift来了,他也支持“+”号操作符了。如:

“let label = "The width is "
let width = 94
let widthLabel = label + String(width)”

同时大家也可能发现了,width是整型,在这里被显式的强制类型转换为字符型,这里有个疑问,就是 如果没有进行强制类型转换,这let widthLabel = label +  width这样是否可以编译过呢?编译器会不会隐式的进行转换呢,我也好期待,因为没有操作环境,只是在看swift官方学习文档中的,因此留在这里,后续有环境进行验证一下。

接下来说说这个类型转换,咋看又像在抄pascal 或java 的语法, c/c++ 的风格的都是(类型)变量,如(char *) var ,(double) var,而不会写成double(var),oc的写法,与c/C++的很像。没太搞明白为毛,即整合c/c++的,又特地搞个风格别致的,当然,什么都不要紧,习惯就好。对吧,大伙说。

不过swift似呼也嗅到了什么,也提提供了另一种字符的转换使用"\()" 操作符,其中括号中的还支持表达式操作。至于反斜扛操作嘛,就有点像大家在C/C++  中的换行串接时,在行尾加上的\的含议差不多。看一下官方给出的例子:

“let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit.”

在此大家可以思考一下,如果真好字符串中碰上了 “请解释2B\(2B就是2b铅笔) 这样的文本时,编译器是否要求进行转议呢,还是直接输出了“请解释2B2B就是2b铅笔”?我也没有试过,期待验证呀。。。。。。

3.数组,字典

在swift的书中说,数组和字典都使用“[]”中括符,并可以通过索引或KEY /VALUE的方式存储。见官方例子:

“var shoppingList = ["catfish", "water", "tulips", "blue paint"]     //声明一个四元素的数组变量
shoppingList[1] = "bottle of water" //重新将元素2的进行赋值
 
var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations”    //动太的添加一个jayne的key值为Public Relations

这个k/V的数组是否长的有点像JOSN啊。反正我看像,还可以动太的添加哦,

创建一个空的数组如: let   emptyArray = String[]() //又是中括号又是圆括符的,看得真让人眼花。不过swift中说了,如果不需要指字类型,则数组可以直接使用"[ ]"

进行。如: shoppingList = []   ,字典则使用 “ [ :]” 来设为空字典。

另外字典增加了一个定议模式,有点像C++中的vector 或map之类的,可以指字 k/v的类型吧。见例:

“let emptyDictionary = Dictionary<String, Float>()”

整体感觉上还是比较像C++吧。


4.条件表达式。

if/swicth 

“let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1

    }
}”
teamScore


为什么都不加括号了?对于多个表达式,还是这样长蛇阵么?

另外书中有这一段“In an if statement, the conditional must be a Boolean expression—this means that code such as if score { ... } is an error, not an implicit comparison to zero.”
个人理解是,如果在一个条件语句中,条件值必须是BOOL表达式的,因为非BOOL表达式不会隐式的与0进行比较,这点可能与传统的if有点不同吧。

其次swift还引入一个较有趣的初始值设置语法使用“?”操作符

如:“var optionalString: String? = "Hello"
optionalString == nil
 
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}”

大家把optionalName改为nil时看一下会有什么结果?按照理解,应该是? = 后的为可选值,即当我们的的变量为nil时,这里如果有?=操作,则会使用?=后的值作为默认值,而不会为nil. 这个等有环境时,验证一下。


再来看一下switch,这个总算有点点进步了,以前的switch大多只支持int或枚举类型,现在swift中把switch语句的表达式判断类型上进行了扩展。其次,每个case不再需要写break;这点不错。


“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."
}”

哈哈,看到没有,没有break哦。。。冒似少了几个B的代码。


思考:如果没有defalut:会是什么样的?有环境验证一下。


5.循环

for - in,for, while, do-while

在for-in  中使用k/v数组,

“let interestingNumbers = [
    "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 interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest”

这个让我感慨的就是每个变量都没有进行显式的声明类型。这也许就是swift所宣存的精确,高效的一个原因之一吧。

另外for 也像pascal一样支持“..”范围操作符。可能熟释DELPHI的朋友一定很深的印象。像这样的for

procedure foroperation

var 

     char c;

begin

     for (c in ['a'..'z']) do

    begin

       //do something.

    end;

end;


官网的例子:

“var firstForLoop = 0
for i in 0..3 {
    firstForLoop += i
}
firstForLoop
 
var secondForLoop = 0
for var i = 0; i < 3; ++i {
    secondForLoop += 1
}
secondForLoop”

两个for 过程是一样的,即i都是从0-3. 其实delphi 中还有low() to high()操作的,这个swift应该没有吧,如果有的话,我想apple的工程师都应经历了pascal的时代。

值得注意的是:swift中不仅有".." 也有"...",分别代表什么呢。两个点,相当于小于如0..3 等价于 0<=i<3 而使用...则相等于 "<=" 如  0..3 等价于 0<=i<=3 


while / do while

“var n = 2
while n < 100 {
    n = n * 2
}
n
 
var m = 2
do {
    m = m * 2
} while m < 100
m”


6.函数的语法

“func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")”

通过这个例子,可以看到使用func关键词进行声明,其次 输入参数 使用“变量:类型”的型式,这还真像pascal,你还别说。最有特色的就是这个返回值,参过->符号指定返回的类型。这个也许是C++的地址函问符的一个使用方式吧,每个函数返回的其实都是一个地址块。另外函数如果有多个返回(即传出参数)怎么处理呢?如C/C++ 的使用“**”指针的指针 如 func(char ** outstring)  但在 swift中则:

“func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
getGasPrices()”

其次swift中的函数参数为数组时的写法,也很特别:

“func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(42, 597, 12)”

内连函数的支持

很多高级语方中都有内连函数,内连函数的使用也是很常见的一种,不仅使得代码执行更加高效,同时也减少了内存碎片。

一起看一下swift的内连函数的写法:

“func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()

    return y
}
returnFifteen()”

还有一个特另的:就是swift还提供了在函数中返回函数来看一下,写法也比较另类:

“func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne

}
var increment = makeIncrementer()     //increment 可理解为addOne的函数指针
increment(7)”

把这段代码解读一下,首先红色部分是一个函数,入参为整型,返回一个整型的值。 再来看最外层的函数makeIncrementer 没有入参,有返回值,而返回值是使用"()"括起来。

int ->int  这个表示返回的为一个函数地址,该函数有一个int型的输入参数,同时还有一个int 型的返回值参数。这与c/c++的函数指很是有差别。



在swift中,函数也可以作为参数进行传递:(见红色部分)

“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 < 10
}

var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)”


最后还有三个没有理解透,等有ios 8 的环境再验证,好像是匿名函数的使用。

“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 }”


写得有点粗,英文不怎么样,边看,边理解,边记录的。


好吧,今天就先学到到这,希望这个对你有所帮助。别还不知道是否为大小写敏感的,若是的话,还真有点蛋痛,看他的官方例子,某些关键词一会大写开头,一会小写开头。。。。。。。下一个学习,将是swift的对象和类(即面向对象编程)

0 0
原创粉丝点击