• 浅谈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使用let来声明,比方说:

    let myConstant = 42



    除了类似于Javascript的变量声明外,这里也提供了类似于Jscript的语法,为变量指定类型。说点题外话,虽然我早知道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:

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


    引用:

    引用我会用Harvard style补起来的,先发表先,代码都是来自于《The Swift Programming Language》



  • 相关阅读:
    leetcode Remove Linked List Elements
    leetcode Word Pattern
    leetcode Isomorphic Strings
    leetcode Valid Parentheses
    leetcode Remove Nth Node From End of List
    leetcode Contains Duplicate II
    leetcode Rectangle Area
    leetcode Length of Last Word
    leetcode Valid Sudoku
    leetcode Reverse Bits
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4335292.html
Copyright © 2020-2023  润新知