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")
} 

 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

 在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文件)。

而在Swift中生成类只有一个文件.swift文件。

示例:

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)")
}

会在控制台输出:

index = 0

index = 1

index = 2

index = 3

index = 4



如果我们使用...这是个闭集合,结果会返回:

index = 4

index = 5

如果你想用c中的结构也是可以的:
for var i = 0; i < 5; i++ {
    println("index = \(i)")
}

只不过for后面不用写括号了。


8.2 if-else结构

和OC中很像,只不过Swift中更简单一些,条件语句不需要写在括号中:

var bookPrice = 1000;
if bookPrice >= 999 {
    println("hey,the book is expensive")
} else {
    println("Okay,I can affort it")
}

8.3 switch结构

Switch中的switch结构拥有非常强大的功能。

示例:

switch recipeName {
    case "Egg Benedict":
        println("Let's cook!")
    case "Mushroom Risotto":
        println("Hmm... let me think about it")
    case "Hamburger":
        println("love it!")
    default:
}
println("Anything else")

首先Swift中的switch中可以控制字符串,OC中的Nsstring是不能被switch控制的,在OC中要实现类似功能你只能使用if-else。

另外你可以看到在每个case中我们都没有写break,在OC中你必须在每个case中写break,否则在当前case结束后会进入下一个case,在Swift中当前case被执行后就会自动跳出switch,如果需要进入下一个case,添加fallthrough语句。

最后,switch的case中可以包含Range操作:

var speed = 50
switch speed {
case 0:
    println("stop")
case 0...40:
    println("slow")
case 41...70:
    println("normal")
case 71..<101:
    println("fast")
default:
    println("not classified yet")
}

9.Tuple元组

元组类型在OC中是没有的,它可以包含多种不同的数据类型,你可以把它用作方法的返回值,这样就可以用一个元组来代替返回一个复杂的对象了。例如:

let company = ("AAPL","Apple Inc",93.5)

你可以把元组company中的值取出来,用法如下:
let (stockCode,companyName,stockPrice) = company
println("stock code = \(stockCode)")
println("company name = \(companyName)")
println("stock price = \(stockPrice)")

或者company.0、company.1这样的方法也能取到值,更好的做法是在定义元组的时候给每个元素起个名字:
let product = (id: "AP234",name: "iPhone 6",price: 599)
println("id = \(product.id)")
println("name = \(product.name)")
println("price = USD\(product.price)")

下面是一个把元组作为返回类型的例子:
class Store {
    func getProduct(number: Int) -> (id: String,name: String,price: Int) {
        var id = "IP435",name = "iMac",price = 1399
        switch number {
            case 1:
                id = "AP234"
                name = "iPhone 6"
                price = 599
        case 2:
            id = "PE645"
            name = "iPad Air"
            price = 499
default:<span style="font-family: Arial,Helvetica,sans-serif;">break }</span><pre name="code" class="plain">        return (id,name,price)
    }
}

 调用: 
 
 
let store = Store()
let product = store.getProduct(2)
println("id = \(product.id)")
println("name = \(product.name)")
println("price = USD\(product.price)")

10.Optional可选型

10.1可选型

可选型通常用在变量之中,可选型的默认值是nil。如果你给一个非可选型的变量赋值nil会报错:

var message: String = "Swift is awesome!" // OK
message = nil // compile-time error

当你的类中的属性没有全部初始化的时候会报错:
class Messenger {
    var message1: String = "Swift is awesome!" // OK
    var message2: String // compile-time error
}

在OC中当你给变量赋值为nil或者没有初始化属性的时候,你是不会收到一个编译时错误的:
Nsstring *message = @"Objective-C will never die!";
message = nil;
class Messenger {
    Nsstring *message1 = @"Objective will never die!";
    Nsstring *message2;<span style="font-family: Arial,sans-serif;">}</span>

但这不代表你不可以在Swift使用没有初始化的属性,我们可以使用?来表示这是一个可选型的变量:
class Messenger {
    var message1: String = "Swift is awesome!" // OK
    var message2: String? // OK
}

10.2那么我们为什么要用可选型呢?

Swift语言设计的时候有很多安全方面的考虑,可选型表示了Swift是一门类型安全的语言,从上面的例子中你可以看到Swift中的可选型会在编译时就去检查某些可能发生在运行时的错误。

考虑下面的OC中的方法:

- (Nsstring *)findStockCode:(Nsstring *)company {
    if ([company isEqualToString:@"Apple"]) {
        return @"AAPL";
    } else if ([company isEqualToString:@"Google"]) {
        return @"GOOG";
    }
return nil; }

这个方法用来判断输入的字符串是不是Apple和Google,如果是其他的话返回nil。

假设我们在类中定义这个方法,并且在类中使用它:

Nsstring *stockCode = [self findStockCode:@"Facebook"]; // nil is returned<pre name="code" class="plain">Nsstring *text = @"Stock Code - ";
Nsstring *message = [text stringByAppendingString:stockCode]; // runtime error
NSLog(@"%@",message);

 这段代码是可以通过编译的,但是会在运行时发生错误,原因就是方法中传入FaceBook返回了nil。 
 

上面OC中的代码我们在Swift中的话是这样写的:

func findStockCode(company: String) -> String? {
   if (company == "Apple") {
      return "AAPL"
   } else if (company == "Google") {
      return "GOOG"
   }
return nil }<pre name="code" class="plain">var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
let message = text + stockCode  // compile-time error
println(message)

 这段代码不能通过编译,可以避免运行时的错误了。显而易见,可选型的应用可以提高代码的质量。 
 

10.3解包可选型

在上面我们已经看到了可选型的用法,那么我们如何判断一个可选型的变量有值还是为nil呢?

示例:

var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
if stockCode != nil {
    let message = text + stockCode!
    println(message)
}

很像OC中的配对,我们使用if判断语句来做可选型的空值判断。一旦我们知道可选型肯定有值的时候,我们可以使用强制拆封(或者叫解包),也就是在变量名后面加一个感叹号来取得变量的值。

如果我们忘记做空值判断会怎样?你进形了强制拆封所以不会发生编译时错误

var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
let message = text + stockCode!  // runtime error

会发生运行时错误,错误提示:

Can’t unwrap Optional.None


10.4可选绑定

除了强制拆封,可选绑定是一个更简单更好的做法。你使用if - let结构的可选绑定来判断一个变量是不是空值

示例:

var stockCode:String? = findStockCode("Facebook")
let text = "Stock Code - "
if let tempStockCode = stockCode {
    let message = text + tempStockCode
    println(message)
}

if let的意思是如果stockCode有值,那么解包它,并且把它赋给一个临时变量tempStockCode,并且执行下面大括号中(条件块)的代码,否则跳过大括号中的代码。

因为tempStockCode是一个新的常量,你不必再使用!来获取它的值。

你可以简化这个过程:

let text = "Stock Code - "
if var stockCode = findStockCode("Apple") {
    let message = text + stockCode
    println(message)
}

我们把stockCode的定义放到if中,这里stockCode不是可选型,所以在下面的大括号中也不用再使用!如果它是nil,那么大括号中的代码就不会执行。

10.5可选链

我们有一个类Code,里面有两个属性code和price,它们的类型是可选型。把上面示例中的stockCode方法的返回值由String改为返回一个Code类型。

class Stock {
    var code: String?
    var price: Double?
}
func findStockCode(company: String) -> Stock? {
    if (company == "Apple") {
        let aapl: Stock = Stock()
        aapl.code = "AAPL"
        aapl.price = 90.32
return aapl
    } else if (company == "Google") {
        let goog: Stock = Stock()
        goog.code = "GOOG"
        goog.price = 556.36
return goog }
return nil }

现在我们计算买了100个苹果需要多少钱:
if let stock = findStockCode("Apple") {
    if let sharePrice = stock.price {
        let totalCost = sharePrice * 100
        println(totalCost)
    }
}

因为findStockCode的返回值是可选值,我们使用可选绑定来判断,但是Stock的price属性也是可选的,所以我们又用了一个可选绑定来判断空值。

上面的代码运行没有问题,不用if let我们有更简单的办法,你可以把上面的代码改成可选链的操作,这个特性允许我们把多个可选类型用?连接,做法如下:

if let sharePrice = findStockCode("Apple")?.price {
    let totalCost = sharePrice * 100
    println(totalCost)
}

Swift 与Objective-c语法参照的更多相关文章

  1. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  3. ios – 声明NSDictionary并在Swift中添加键值对?

    我一直在尝试使用类类型键和值来声明一个NSDictionary,如下所示:这里,“Category”和“SubCategory”是全局类.我知道我不能将类类型用于关键字段.但是,无论如何,我应该做到这一点.有没有办法做到这一点?如何声明专门的NSDictionary或类似的东西来做到这一点?

  4. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  5. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  6. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  7. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  8. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  9. xamarin – 崩溃在AccountStore.Create().保存(e.Account,“);

    在Xamarin.Forms示例TodoAwsAuth中https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/oauth/成功登录后,在aOnAuthenticationCompleted事件中,应用程序在尝试保存到Xamarin.Auth时崩溃错误说不能对钥匙串说期待着寻求帮助.解决方法看看你

  10. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部