第一个和第二个使用方法大同小异与很多语言,对于Objective-C来说,有趣的是第三个和第四个。我们发现了,无需使用NSArray类,Swift的数组,本身就支持key-value数组。
同一时候。我们也能建立字典类型。这个使用方法是非常多语言都存在的:
let emptyDictionary = Dictionary<String, Float>()
流程控制语句是变更的比較大的,褒义的讲,for-in还有if-else的语法更加自然了:
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
teamScore
实际上,在Objective-C的语法中。仅仅是多了个括号。
假设不了解这个语法的能够评论写下或者Google一下。
事实上猜应该也能猜出来吧。值得一提的是,由于抛弃了C,所以不要想着0为false其余true的使用方法了,if仅仅能推断boolean。
这里有一个奇怪的使用方法,我见识短浅。实在没见过。
各位注意到没,第一个变量optionalName的类型是String,但与此前不同的是。String后面多了个?
。这是干嘛的呢。
依据文档上说,加了?
,就代表这个变量的值是可选的。啥?可选的?什么意思??我想了非常久非常久,得出了非常多错误结论,最后一句话总结,你在其他语言是否能int i=NULL?不能吧?懂了吧。我这里说的仅仅是新特性,其他的都不是。
嗯,最终看到函数了,函数也比較灵(qi)活(pa),比方说实现了多个返回值。
先从比較简单的函数谈起:
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")
这个函数各位应该能猜到是怎么回事吧?这是一个简单的2个參数1个返回值的函数。name和day是參数名。他们:后面就是參数的类型了,这个在JScript中有。返回值类型当然就是->后面的String了。
灵(qi)活(pa)的部分来了,我曾经好多次见过有人问,为啥不能返回多个值啊?我们经常使用一些类(class)来解决问题。但如今easy了,这样即可:
func getGasPrices() -> (Double, Double, Double) {
return (3.59, 3.69, 3.79)
}
getGasPrices()
其实看了这个非常多人可能和我一样想问。哪里来的变量能够同一时候接受3个值?其实,这里的3个dobule返回值是没意义的,演示多返回值而已。
这里有个样例:
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
for character in string {
switch String(character).lowercaseString {
case "a", "e", "i", "o", "u":
++vowels
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
++consonants
default:
++others
}
}
return (vowels, consonants, others)
}
看到没,这里的3个int返回值都有了返回名称,用常量total储存通过.来使用。
还有就是,函数定义中能嵌套个子函数定义,比方说func a{....func b{.....}}:
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen()
这个应该非常好理解。
非常多没有函数编程经验的人看了书,有疑问,说啥是functions are a first-claas type? 事实上这个非常好理解。就是“函数是一等的”。也能够说是“一等函数”。
在非常多类C语言中,你假设想把函数做为參数传递出去。要用函数指针或者代理来间接传递吧?可是在Javascript中。函数也是一个类型。这种函数被称为“一等函数”,既然是个类型,就能像普通的变量一样愉快的传来传去。 Swift中的函数就是这种。
在Swift中,函数能做为还有一个函数的返回值。等等。有点绕口了。这样说吧,一个函数能返回还有一个函数,不饶了吧?
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
既然能当返回值传,当然也能当參数传:
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)
另外,也支持闭包。假设里面仅仅有一句话。那么就返回那句话的左值
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})l
好了,開始谈谈类了。类事实上就是长这样,没有我们期待的Swift Style:
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
事实上结合了前面谈的,其余跟Java几乎相同,init为构造。
class Square: NamedShape {
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length \(sideLength)."
}
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()
好了,有变化的来了,以下代码演示了类属性的getter和setter。这个语法明显有C#的影子,可是(看以下)
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
事实上在set里面还有didset。willset。
。
。。。。
。。真实非(sang)常(xin)灵(bing)活(kuang)!
大部分谈完了,下一章接着讲,嗯。标题加上(1)。总结一下,这个语言我不感觉适合刚開始学习的人,由于过于灵活,大量的结合了函数编程的语法,我感觉难以控制和统一代码质量。还有本人才疏学浅,这篇文章分析的错误率低于50%就谢天谢地了,请各路神仙,各位老师不吝赐教!!
!
!
请发表评论