订阅移动开发RSS CSDN首页> 移动开发

Swift最酷炫的七大功能

发表于2014-07-04 17:00| 次阅读| 来源Drewag| 0 条评论| 作者Andrew Wagner

摘要:Swift语言中有哪些让iOS和OS X开发者颇为兴奋的部分?与Ruby、C++、Objective-C语言等语言相比,Swift又有哪些优势?本文作者在花费大量时间对Swift进行研究之后,总结出了Swift最为酷炫的七大功能。

本文作者Andrew Wagner是一名资深的iOS和Web开发者,在Swift面世之后,他花费了许多的时间来研究Swift,在文章中,他不仅分享了Swift语言中让iOS和OS X开发者颇为兴奋的部分,还将其与Ruby、C++、Objective-C语言进行比较,总结出了Swift最为酷炫的七大功能。


1. 支持扩展结构和字面量

Swift中我最喜欢的一点就是可以扩展结构,这对于向现有结构中添加函数可谓大有裨益。对我来说,最好的例子就是它能够实现向支持返还矩形类Rectangle中心点的CGRect添加一个中心法:

extension CGRect {
    var center : CGPoint {
        return CGPoint(
            x: self.origin.x + self.size.width / 2.0,
            y: self.origin.y + self.size.height / 2.0
        )
    }
}

我不得不使用大量的Rectangle中心点,而如果我可以利用name来取代繁杂的数学计算,就能够让代码的意图显得更加清晰明了。

此外,Swift还支持扩展字面量。在Ruby中,有一个名为repeat的非常有用的整数方法。基本上你可以使用块来对一个整数调用repeat,即使重复定义整数也可被执行。然而在Swift中,一切就简单得多:

extension Int {
    func repeat(block : () -> ()) {
        for i in 0..self {
            block()
        }
    }
}
接着,你就可以像这样使用它:

3.repeat {
    // called 3 times
    println("hello")
}
注:如果唯一参数为闭包,则可省略括号。

2. 更加灵活的枚举

Objective-C的枚举语法着实欠佳,而Swift中的枚举则更加灵活,你可以定义Swift的枚举存储任何类型的相关值,例如,网络请求:

struct NetRequest {
    enum Method {
        case GET
        case POST(String)
    }
    var URL : String
    var method : Method
}
var getRequest = NetRequest(URL: "http://drewag.me", method: .GET)
var postRequest = NetRequest(URL: "http://drewag.me", method: .POST("{\"username\": \"drewag\"}"))

GET请求并不具备请求主体,但POST却具备。在方法枚举中,如果没有一个潜在闲置的成员变量,则可以直接定义POST内容主体。

关于这点,最好的例证就是Swift的Optional。Swift编译器能够给予我们许多语法上的甜头,但落到实处,当你像这样定义一个可选字符串时:var myString : String?,编译器会将其转换为var myString : Optional<String>。定义Optional:

enum Optional {
    case None
    case Some(T)
}

3. 更为强大的泛型

集合在Objective-C中使用的都是最通用的泛型类,这就意味着开发者可以将任何值带入一个包含混合对象的集合当中,但却会造成集合类型模糊。这也是我所认为的C++比Objective-C更好的一个地方,C++有允许定义具备诸如vector<int>等特定类型的集合的Templates。Swift则借用了极为相似的语法,和可根据自我需求定义写出灵活可重用的函数及类型的泛型(Generics)代码。

接下来,让我们来看一下不仅省时更能避免Bug出现的泛型的一个简单示例:

class Word {
    enum PartOfSpeech {
        case Noun, Pronoun, Verb
    }
    var value : String
    var partOfSpeech : PartOfSpeech
    init(_ value: String, _ partOfSpeech : PartOfSpeech) {
        self.value = value
        self.partOfSpeech = partOfSpeech
    }
}
var sentence = [Word("I", .Pronoun), Word("ran", .Verb), Word("home", .Noun)]
    class Word {
    enum PartOfSpeech {
        case Noun, Pronoun, Verb
    }
    var value : String
    var partOfSpeech : PartOfSpeech
    init(_ value: String, _ partOfSpeech : PartOfSpeech) {
        self.value = value
        self.partOfSpeech = partOfSpeech
    }
}
var sentence = [Word("I", .Pronoun), Word("ran", .Verb), Word("home", .Noun)]
sentence.append("quickly") // Cannot convert the expression's type '()' to type 'Word'
sentence[0].lowercaseString // Could not find member 'lowercaseString'
sentence[0].value.lowercaseString

4. 不同类型多重函数

在Swift中,当定义一个函数时,你可以定义一个或多个有名字和类型的值,作为函数的输入,也可以定义某种类型的值作为函数执行结束的输出。这对于定义可适用于各种类型但需要不同实现的函数来说绝对是如虎添翼。

func mathmaticallyAdd(a : Int, b : Int) -> Int {
    return a + b;
}
func mathmaticallyAdd(a : String, b : String) -> String {
    let aNum = a.bridgeToObjectiveC().intValue
    let bNum = b.bridgeToObjectiveC().intValue
    return "\(aNum + bNum)"
}
mathmaticallyAdd(2, 7) // returns 9
mathmaticallyAdd("2", "7") // returns “9”

在上面的代码段中,无缘无故地定义了mathmaticallyAddInts和mathmaticallyAddStrings两个不同的函数,因为其用意很清楚,只需mathmaticallyAdd即可,那这样就会显得过于繁琐冗长。定义使用Int,函数可以只使用+操作符,然而,在字符串实现中,该函数必须首先将字符串转换为整数。

0
0