zoukankan      html  css  js  c++  java
  • 浅谈Swift语法

    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使用类似F#的let来声明,比方说:

    let myConstant = 42



    除了类似于Javascript的变量声明外,这里也提供了类似于Jscript和C#的语法,为变量指定类型。同一时候这里也和一些函数式语言如F#有点相像。说点题外话,虽然我早知道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。这个语法明显有C#的影子,可是(看以下)

    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%就谢天谢地了,请各路神仙,各位老师不吝赐教!!

    微笑





  • 相关阅读:
    robots.txt
    procdump和mimikatz工具配合破解windows账户口令
    通过vbs脚本控制方向盘按键
    批处理删除文件或文件夹代码
    彩色线条雨特效html代码
    secureCRT
    chrome 更新flash插件
    python命令行下安装redis客户端
    FastJson使用
    Redis 学习(二)
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7281574.html
Copyright © 2011-2022 走看看