1. 定义常量和变量
a. Swift语法
常量:
let MaxNumber = 10
变量:
var name = 1
b. Java语法
常量:
public final int MaxNumber= 10;
变量:
public String name = "morden";
这里要注意的是swift有类型标注(type annotation)这个语法:如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。但是因为swift编译器可以进行类型安全判定,所以一般为了代码简练,
可以不加类型标注,关于类型标注,后面会有提到。加类型标注的语法如下:
常量:
let MaxNumber :Int = 10
变量:
var name : String = "morden"
常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。
2. Swift和Java的输出语法
Swift:
print("hello world")
Java
System.out.println("hello world");
3. 注释
Swift和Java注释大体相同,都可以单行注释和多行注释。唯一不同点就是Swift支持多行注释可以嵌套在其它的多行注释中。
/* 这是第一个多行注释的开头 /* 这是第二个被嵌套的多行注释 */ 这是第一个多行注释的结尾 */
4. 分号
Java要求每一行代码都有分号,而Swift不同,不要求每一行必须有分号,但是一种情况除外:当在同一行内写多条独立的语句时候,每个语句需要分号隔开
let apple : String = "apple" ; print("hello world");
5. 类型标注
类型标注:在Swift中,每次声明常量和变量的时候,不是一定要显式指定类型。如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。有了类型推断,编译器可以在编译代码的时候自动推断出表达式的类型。Swift 和Java都是一个类型安全(type safe)的语言。如果你申明的变量是String类型的时候,再对其进行赋值时候,传了int类型,编译器会报错。但是在语法上,这两个语言有所不同。
Java一般申明变量时候,会将类型放在前面,如下代码:
String name = "morden";
Swift会将类型放在后面,如下代码:
var name : String = "morden"
而有时候,我们申明变量时候,不加类型,编译器就会自己推断变量类型,这就是类型标注
在Swift中,具体类型标注代码如下:
let number = 42
number会被推测为 Int 类型
let anotherNumber = 3 + 0.14159
原始值 anotherNumber 没有显式声明类型,而表达式中出现了一个浮点字面量,所以表达式会被推断为Double
类型。
6. 数值型字面量
Swift和Java在数值型字面量方面有很多异同,只有十进制和16进制表示是相同的。
Swift:
- 一个十进制数,没有前缀
- 一个二进制数,前缀是
0b
- 一个八进制数,前缀是
0o
- 一个十六进制数,前缀是
0x
Java:
- 一个十进制数,没有前缀
- 一个二进制数,Java没有二进制的表示方式,一般都16进制表示
- 一个八进制数,前缀是
0
- 一个十六进制数,前缀是
0x
另外,Swift数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字面量:
let paddedDouble = 000123.456 let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1
7. 整数和浮点数转换
Swift:Swift中不支持隐式转换,当两个变量存储不同范围的值时候,所以你必须根据不同情况选择性使用数值型类型转换。代码如下:
let three = 3 let pointOneFourOneFiveNine = 0.14159 let pi = Double(three) + pointOneFourOneFiveNine
这个例子中,常量three
的值被用来创建一个Double
类型的值,所以加号两边的数类型须相同。如果不进行转换,两者无法相加。
Java支持隐式转换,代码如下:
int three = 3; double pointOneFourOneFiveNine = 0.14159; double pi = three + pointOneFourOneFiveNine;
Swift语法支持类型别名,这点Java不支持,当在编程中,定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名。具体代码如下:
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
UInt16 取值范围是0-255 maxAmplitudeFound 现在是 0
8. 布尔值
Swift的布尔(Boolean)类型,关键字叫做Bool
。Java是boolean关键字。具体用法上有点差别,但是还在接受范围之内。
Swift:
let flag : Bool = false if flag{ print("Mmm, tasty turnips!") }else{ print("Eww, turnips are horrible.") }
Java:
boolean flag = true; if(flag){ System.out.println("Mmm, tasty turnips!"); }else{ System.out.println("Eww, turnips are horrible."); }
9. key-value
Swift提出了一个非常有意思的语法叫元组。有点类似Java的map数据结构,但是又与map有非常大的不同。这里介绍下元组的用法。
let http404Error = (404, "Not Found")
// http404Error 的类型是 (Int, String),值是 (404, "Not Found")
let http200Status = (statusCode: 200, description: "OK")
//可以在定义元组的时候给单个元素命名:
可以将一个元组的内容分解(decompose)成单独的常量和变量,然后你就可以正常使用它们:
print(statusCode) print("The status code is \(http404Error.0)") print("The status code is \(http404Error.statusCode)") print(statusMessage) print("The status code is \(http404Error.1)") print("The status code is \(http404Error.description)")
10. 可选类型(optionals)
我们先看下面一段代码:
let possibleNumber = "123" let convertedNumber = possibleNumber.toInt() // convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
因为toInt
方法可能会失败,所以它返回一个可选类型(optional)Int
,而不是一个Int
。一个可选的Int
被写作Int?
而不是Int
。问号暗示包含的值是可选类型,也就是说可能包含Int
值也可能不包含值。(不能包含其他任何值比如Bool
值或者String
值。只能是Int
或者什么都没有。)
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!
)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping):
let possibleNumber = "123" let convertedNumber=Int(possibleNumber); let stee = convertedNumber! //stee 是Int,不是Int?
可选绑定(optional binding):来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。看下面代码:
let possibleNumber = "123" if let actualNumber = Int(possibleNumber) { print("\(actualNumber) has an integer value of \(actualNumber)") } else { print("\(possibleNumber) could not be converted to an integer") } // 输出 "123 has an integer value of 123"
“如果possibleNumber.toInt
返回的可选Int
包含一个值,创建一个叫做actualNumber
的新常量并将可选包含的值赋给它。”
如果转换成功,actualNumber
常量可以在if
语句的第一个分支中使用。它已经被可选类型包含的值初始化过,所以不需要再使用!
后缀来获取它的值。在这个例子中,actualNumber
只被用来输出转换结果。
11. nil
在 Swift 中,nil
不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil
,不只是对象类型。一些简单的用法如下:
var serverResponseCode: Int? = 404 // serverResponseCode 包含一个可选的 Int 值 404 serverResponseCode = nil // serverResponseCode 现在不包含值 var surveyAnswer: String? // surveyAnswer 被自动设置为 nil
12. 隐式解析可选类型
隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(String?
)改成感叹号(String!
)来声明一个隐式解析可选类型,隐式解析可选类型主要被用在 Swift 中类的构造过程中。
一个隐式解析可选类型其实就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。下面的例子展示了可选类型String
和隐式解析可选类型String
之间的区别:
let possibleString: String? = "An optional string." println(possibleString!) // 需要惊叹号来获取值 // 输出 "An optional string." let assumedString: String! = "An implicitly unwrapped optional string." println(assumedString) // 不需要感叹号 // 输出 "An implicitly unwrapped optional string."
注意:
如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。
13. 断言
断言会在运行时判断一个逻辑条件是否为true
。从字面意思来说,断言“断言”一个条件是否为真。你可以使用断言来保证在运行其他代码之前,某些重要的条件已经被满足。如果条件判断为true
,代码运行会继续进行;如果条件判断为false
,代码运行停止,你的应用被终止。
如果你的代码在调试环境下触发了一个断言,比如你在 Xcode 中构建并运行一个应用,你可以清楚地看到不合法的状态发生在哪里并检查断言被触发时你的应用的状态。此外,断言允许你附加一条调试信息。
你可以使用全局assert
函数来写一个断言。向assert
函数传入一个结果为true
或者false
的表达式以及一条信息,当表达式为false
的时候这条信息会被显示:
let age = -3 assert(age >= 0, "A person's age cannot be less than zero") // 因为 age < 0,所以断言会触发
当条件可能为假时使用断言,但是最终一定要保证条件为真,这样你的代码才能继续运行。断言的适用情景:
- 整数类型的下标索引被传入一个自定义下标脚本实现,但是下标索引值可能太小或者太大。
- 需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。
- 一个可选值现在是
nil
,但是后面的代码运行需要一个非nil
值。
参考链接:
http://special.csdncms.csdn.net/the-swift-programming-language-in-chinese/Introduction/template/chapter2/01_The_Basics.html