Swift已经推出了一段时间了,今天来总结一下Swift与Objective-c(以下简称OC)的语法有哪些不同。
1.常量与变量:
在Swift中定义常量和变量很简单,常量使用let关键字,变量使用var关键字。
var numberOfRows = 30 let maxNumberOfRows = 100
在OC中我们声明一个变量的时候需要指定数据类型:
const int count = 10; double price = 23.55; NSString *myMessage = @"Objective-C is not dead yet!";
但是在Swift中我们不用,虽然Swift是强类型语言,但是它可以根据赋值进行类型推断:
let count = 10 // count会被识别为Int var price = 23.55 // price会被识别为Double var myMessage = "Swift is the future!" // myMessage会被识别为String
当然在Swift中写上变量名也不会有任何问题:
var myMessage : String = "Swift is the future!"
2.Swift中不用再写分号了!
在OC中你需要在每一句的后面写上“;”以表达结束,不然会报错,在Swift中你不需要再写分号了,当然你写上也没有问题。
var myMessage = "No semicolon is needed"
3.String
在Swift中字符串的类型是String,不论你定义的是常量字符串还是变量字符串。
let dontModifyMe = "You cannot modify this string" var modifyMe = "You can modify this string"
在OC中你需要使用NSString和NSMutableString来区分字符串是否可以被修改。
在Swift中连接两个字符串组成新字符串非常方便,使用“+”:
let firstMessage = "Swift is awesome. " let secondMessage= "What do you think?" var message = firstMessage + secondMessage println(message)
println是Swift中一个全局的打印方法。
在OC中我们使用stringWithFormat方法:
NSString *firstMessage = @"Swift is awesome. "; NSString *secondMessage = @"What do you think?"; NSString *message = [NSString stringWithFormat:@"%@%@",firstMessage,secondMessage]; NSLog(@"%@",message);
在OC中要判断两个字符串是否相同你不能用“==”,你需要使用方法isEqualToString方法,但是在Swift中你可以使用“==”来判断字符串是否相同。
var string1 = "Hello" var string2 = "Hello"<pre name="code" class="plain">if string1 == string2 { println("Both are the same") }
@H_502_42@ 4.Array数组
数组的用法Swift和OC差不多,我们来看示例:
在OC中:
NSArray *recipes = @[@"Egg Benedict",@"Mushroom Risotto",@"Full Breakfast",@"Hamburger",@"Ham and Egg Sandwich"];
在Swift中:
var recipes = ["Egg Benedict","Mushroom Risotto","Full Breakfast","Hamburger","Ham and Egg Sandwich"]
在OC中你可以向NSArray和NSMutableArray中插入任意类型的参数,但是在OC中只能插入相同的参数。
和NSArray相似,Swift中的Array也有很多方法,比如count方法返回数组中的元素个数:
var recipes : [String] = ["Egg Benedict","Ham and Egg Sandwich"]<pre name="code" class="plain">var numberOfItems = recipes.count // recipes.count will return 5
@H_502_42@ 在OC中你使用NSMutableArray中的方法addObject来增加数组中的元素,Swift中的方法更简单,你可以使用“+=”,比如:
recipes += ["Thai Shrimp Cake"]不过请注意这个方法是数组间的,如果一个单个元素要加入数组中请在元素外面增加[]。
要取出或者替换数组中的元素,使用索引,这点跟OC中相同:
var recipeItem = recipes[0] recipes[1] = "Cupcake"
在Swift中可以使用Range来表示范围:比如
recipes[1...3] = ["Cheese Cake","Greek Salad","Braised Beef Cheeks"]这里替换的是recipes中的第二到第四个元素。
5.Dictionary字典
字典是一种集合类型,由键值对组成,这一点和OC中的NSDictionary很类似,请看示例:
OC中:
NSDictionary *companies = @{@"AAPL" : @"Apple Inc",@"GOOG" : @"Google Inc",@"AMZN" : @"Amazon.com,Inc",@"FB" : @"Facebook Inc"};
Swift中:
var companies = ["AAPL" : "Apple Inc","GOOG" : "Google Inc","AMZN" : "Amazon.com,"FB" : "Facebook Inc"]你也可以声明它的字典类型:
var companies: Dictionary<String,String> = ["AAPL" : "Apple Inc","FB" : "Facebook Inc"]
要遍历一个字典,需要使用元组来保存每一次循环的字典中的信息:
for (stockCode,name) in companies { println("\(stockCode) = \(name)") }
你也可以单独遍历字典中的键或者值:
for stockCode in companies.keys { println("Stock code = \(stockCode)") } for name in companies.values { println("Company name = \(name)") }
如果想给字典添加新的键值对,那么使用如下语句:
companies["TWTR"] = "Twitter Inc"
6.Class类
在OC中创建类的话,会得到两个文件,一个接口文件(.h文件)和一个实现文件(.m文件)。
示例:
class Recipe { var name: String = "" var duration: Int = 10 var ingredients: [String] = ["egg"] }
在上面的示例中我们创建了一个Recipe类,里面有三个属性,并且都声明了类型,做了初始化。在Swift中类在初始化的时候它的属性必须都被初始化。如果你不想设置某个属性的默认值的话,使用?把它加入可选链中:
class Recipe { var name: String? var duration: Int = 10 var ingredients: [String]? }这样当你创建一个类的实例的时候:
var recipeItem = Recipe()
这些可选链中的属性的初始值是nil。你可以给它们赋值:
recipeItem.name = "Mushroom Risotto" recipeItem.duration = 30 recipeItem.ingredients = ["1 tbsp dried porcini mushrooms","2 tbsp olive oil","1 onion,chopped","2 garlic cloves","350g/12oz arborio rice","1.2 litres/2 pints hot vegetable stock","salt and pepper","25g/1oz butter"]
类可以继承父类和遵守协议,示例:
OC中:
@interface SimpleTableViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>
Swift中:
class SimpleTableViewController : UIViewController,UITableViewDelegate,UITableViewDataSource
7.Methods方法
Swift允许你在类、结构体和枚举中创建方法。
下面是一个没有参数和返回值的方法:
class TodoManager { func printWelcomeMessage() { println("Welcome to My ToDo List") } }
在OC中调用一个方法的格式如下:
todoManager printWelcomeMessage];
在Swift中调用一个方法的格式如下:
todoManager.printWelcomeMessage()
如果要建立一个带参数和返回值的方法,格式如下:
class TodoManager { func printWelcomeMessage(name:String) -> Int { println("Welcome to \(name)'s ToDo List") return 10 } }
"->"用来指示方法的返回值类型。
var todoManager = TodoManager() let numberOfTodoItem = todoManager.printWelcomeMessage("Simon") println(numberOfTodoItem)
8.Control Flow控制流
Swift中的控制流和循环颇有C语言的风格。
8.1for循环
for循环使用 for - in的结构,并且可以和Range(...或者..<)配合使用:
for i in 0..<5 { println("index = \(i)") }
会在控制台输出: @H_404_149@
index = 0
index = 1
index = 2
index = 3
index = 4