Apple 在2014年6月的WWDC公布了一款新型的开发语言,很多美国程序猿的价值观貌似和我们非常大的不同,在公布的时候我们能够听到,场下的欢呼声是接连不断的。假设换作我们,特别是像有Objective-C开发经验的开发人员,是否也能和他们一样,乐观积极的面对这一新型的,剔除C的语言呢?当然,这对非常多不愿意使用或者反感Objective-C的开发人员们,提供了一条途径进行iOS本地应用开发。

好了,言归正传,这里,我从一个iOS开发者的角度,来浅谈一下Swift的语法!

首先,一个非常easy的使用方法,输出函数:

println("Hello, world")

从这段代码里,我们能够发现这个函数名好像在Java里见过:

System.out.println("Hello world");

依据Apple在其书籍《The Swift Programming Language》中的描写叙述,这句代码实际上已经是能够做为一个独立的程序来执行[1],在调用这个函数时,并不须要写多余的代码,这实际上反应了该语言的简洁性。同一时候,我还发现,这句代码后没有我们常见的 “ ; " 分号,这是学某个语言的节奏吗?好像是python还是哪个?

在变量声明这一块,我们使用了var来作为变量声明符,比方说:

var myVariable = 42
myVariable = 50

我们发现,这里的使用方法和Javascript比較相似,使用var来定义变量,并不声明变量类型。它的格式就是 var 变量名。

对于常量声明,Swift使用let来声明,比方说:

let myConstant = 42

除了类似于Javascript的变量声明外,这里也提供了类似于Jscript的语法,为变量指定类型。说点题外话,虽然我早知道Javascript和JScript是不同的,可是实际的不同是我在使用Unity脚本时才发现的,Unity脚本支持Javascript,但实际上,起初非常多语法我并没有见过,直到我在MSDN上找到了JScript的文档和教程,才发现这实际上是JScript。Unity文档中非常多都是指向MSDN的。

这里显示了怎样指定变量类型:

let explicitDouble: Double = 70

假设我们要转换变量的类型,必须显式的转换,如:

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

转换的方式就是:目标类型(变量)。这样的转换方式我是不赞同的,假设能像Java一样自己主动转换那就更好了。

相信非常多学过C以及类C语言的朋友对%d不陌生吧,我经常拿它用来把整形(int)塞进字符串里,这里相同有个长得像的方法:

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

这种方法就是"字符串\(要转换的变量如int)字符串"。 有点儿类似类C语言里的 XXXX("字符串%d字符串", 要转换的int);

如今我们要看一下数组了,数组的基本使用代码例如以下:

var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water" var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations”

第一个和第二个使用方法大同小异与很多语言,对于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。

这里有一个奇怪的使用方法,我见识短浅,实在没见过。

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

各位注意到没,第一个变量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)
}
let total = count("some arbitrary string!")
println("\(total.vowels) vowels and \(total.consonants) consonants")

看到没,这里的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:

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
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength

事实上在set里面还有didset,willset。。。。。。。。真实非(sang)常(xin)灵(bing)活(kuang)!

大部分谈完了,下一章接着讲,嗯,标题加上(1)。总结一下,这个语言我不感觉适合刚開始学习的人,由于过于灵活,我感觉难以控制和统一代码质量。还有本人才疏学浅,这篇文章分析的错误率低于50%就谢天谢地了,请各路神仙,各位老师不吝赐教!!!!

引用:

引用我会用Harvard style补起来的,先发表先,代码都是来自于《The Swift Programming Language》

浅谈Swift语法的更多相关文章

  1. 浅谈 Swift 2 中的 Objective-C 指针

    浅谈 Swift 2 中的 Objective-C 指针 2015-09-07  499 文章目录 1. 在 Swift 中读 C 指针 2. 在 Swift 中创建 C 指针 3. 总结 作者:Ja ...

  2. 浅谈Swift集合类型

    Swift 的集合表现形式由数组和字典组成.它可以完美的存储任何呢想存储的东西. 数组是一个同类型的序列化列表集合,它用来存储相同类型的不同值.字典也是一个数组,但它的存值方式类似于Map,通过一对一 ...

  3. 浅谈Swift和OC的区别

    前言 转眼Swift3都出来快一年了,从OC到Swift也经历了很多,所以对两者的一些使用区别也总结了一点,暂且记录下,权当自己的一个笔记. 当然其中一些区别可能大家都有耳闻,所以这里也会结合自身的一 ...

  4. 浅谈 Swift 中的 Optionals

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  5. 技术分享 | 浅谈mysql语法解析调试方法

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 本文向您介绍一种利用mysql解析器和bison的调试选项进行sql语法解析跟踪 ...

  6. 浅谈Kotlin(二):基本类型、基本语法、代码风格

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 通过上面的文章,在A ...

  7. 浅谈Kotlin(一):简介及Android Studio中配置

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

  8. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  9. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

随机推荐

  1. FastDFS的学习与使用(大量帖子)

    http://www.oschina.net/p/fastdfs http://bbs.chinaunix.net/forum-240-1.html

  2. 减少可执行程序size的三个常用软件

    减少可执行程序size的三个常用软件 linux下面,直接用strip 这个命令 #:strip xxx 可以去掉编译调试信息和各种符号表,能够大大减小可执行程序size windows下面这种exe ...

  3. Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换

    public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...

  4. Spring中的p标签(转)good

    Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式. 在XML文件头部添加xmlns:p="http://www.springframework.org/sch ...

  5. [cocos2d-x]HelloWorldDemo

    实现一个demo,具备以下功能: 1.让几个字分别位于中间和四个角落. 2.中间的字体改变,并且带有闪烁功能. 3.单点触摸和多点触摸,并且能够实现滑动效果,滑动的话必须使用带有bool返回值的单点触 ...

  6. jssdk微信图片上传功能

    /*wx.config({ debug: false, appId: data.appid, timestamp: data.timestamp, nonceStr: data.nonceStr, s ...

  7. 学习了LINUX下用C语言遍历文件夹,一些心得

    struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 具体代码如下,仅供参考 # ...

  8. JSP自定义标签——简单标签(2)

    在前一篇博客中,我们已经学习了自定义的简单标签的基本使用方法,这一篇我们来学习如何在简单标签中添加标签属性.对自定义标签添加一些属性,可以使我们的标签功能更加灵活和复用.例如前一篇博客使用简单标签来对 ...

  9. vim 操作指令2

    VIM命令大全 光标控制命令 命令 光标移动 h 向左移一个字符 j 向下移一行 k 向上移一行 l 向右移一个字符 G 移到文件的最后一行 w 移到下一个字的开头 W 移到下一个字的开头,忽略标点符 ...

  10. Servlet过滤器——过滤器分析流量

    1.概述 Servlet过滤器可以对用户提交的数据或服务器返回的数据进行更改.任何到达服务器的请求都会首先经过过滤器的处理.本实例应用过滤器的这个特点,编写了一个在过滤器中统计网站流量的实例. 本实例 ...