• Swift语法初见


    Swift语法初见

    http://c.biancheng.net/cpp/html/2424.html

    类型的声明:

    let implicitInteger = 70
    let implicitDouble = 70.0
    let explicitDouble: Double = 70
    

    注:如果初始值没有提供足够的信息(或者没有初始值),那你需要在变量后面声明类型,用冒号分割。

    数值转换:

    let label = "The width is"
    let width = 94
    let widthLabel = label + String(width)
    

    注:值永远不会被隐式转换为其他类型。如果你需要把一个值转换成其他类型,请显式转换。

    let apples = 3
    let oranges = 5
    let appleSummary = "I have (apples) apples."
    let fruitSummary = "I have (apples + oranges) pieces of fruit."
    

    注:有一种更简单的把值转换成字符串的方法:把值写到括号中,并且在括号之前写一个反斜杠。

    数组、字典的初始化和赋值

    var emptyArray = NSMutableArray.init()
    var emptyArray1 = NSMutableArray()
    
    emptyArray[0] = "00000";
    emptyArray[1] = "11111";
    emptyArray.add("22222")
    var emptyDictionary = NSMutableDictionary()
    
    emptyDictionary["1"] = 67788
    emptyDictionary["2"] = "67788"
    emptyDictionary.setValue("sss", forKeyPath: "key")
    

    控制流

    let vegetable = "cucumber"
    switch vegetable {
    case "celery":
        let vegetableComment = "Add some raisins and make ants on a log."
    case "cucumber", "watercress":
        let vegetableComment = "That would make a good tea sandwich."
    case let x where x.hasSuffix("pepper"):
        let vegetableComment = "Is it a spicy (x)?"
    default:
        let vegetableComment = "Everything tastes good in soup."
    }
    

    注:支持任意类型比较;支持多个条件匹配;不需要break,因为只运行一个case; 除非case覆盖所有可能,否则default不可缺失

    let interestingNumbers:NSDictionary = ["Prime": [2, 3, 5],"Fibonacci": [1, 1, 8],"Fibonacc": [1, 1, 8]]
    
    for (a,b) in interestingNumbers{
        print(a)
        print(b)
    }
    

    输出:Fibonacci [1, 1, 8] Prime [2, 3, 5]
    for c in interestingNumbers{
    print(c)
    }
    输出:(key: "Fibonacci", value: [1, 1, 8]) (key: "Prime", value: [2, 3, 5])

    注:for in 遍历字典时,两个变量表示 key,value,一个变量表示 key-value键值对

    for i in 0...1 {
        interestingNumbers.object(forKey: interestingNumbers.allKeys[i])
    }
    
    for i in 0..<2 {
        interestingNumbers.object(forKey: interestingNumbers.allKeys[i])
    }
    

    函数和闭包

    func greet(nameOut name:String,_ day:String) -> String{
        return "Hello (name), today is (day)."
    }
    
    greet(nameOut:"sss","sss")
    

    注:1,区分内部和外部参数名 2,返回值的方式

    func greet1(names:Int...) -> (a:Int,b:String,c:String){
        let a = names[0]
        let b = "ss"
        let c = "aaa"
        
        return (a,b,c)
    }
    
    greet1(names: 1,2,3)
    
    func makeIncrementer() -> ( (Int) -> Int ) {
        func addOne(number:Int) ->Int {
            return 1+number
        }
        return addOne
    }
    var increment = makeIncrementer()
    increment(7)
    

    注:1,函数可作为返回值

    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 number = [20, 19, 7, 12]
    hasAnyMatches(list:number,condition:lessThanTen)
    

    注:1,函数可作为参数

    let numbers = [10,20,30]
    
    numbers.map({
        (number: Int) -> Int in
        let result = 3 * number
        
        let aiia = "ssss"
        
        return result
    })
    
    let mappedNumbers = numbers.map { number in number/2
    }
    
    print (mappedNumbers)
    
    
    class Shape {
        var name = "aa"
        let numberOfSides = 0
        init(name:String) {
            self.name = name
        }
        func simpleDescription(name:String) -> String {
            return "A shape with (numberOfSides) sides."
        }
        
        func funcInFunc(name:String)->((Int) -> (Int)){
            func addSelf(number:Int)->Int{
                return 1+number
            }
            return addSelf;
        }
    }
    
    Shape(name:"bb")
    let p = Shape(name:"aa").funcInFunc(name:"sss")
    p(20)
    

    注:1,函数可作为返回值

    numbers.map({
        (number:Int)->Int in
        
        var aa = number
        let num = number % 2
        if(num == 1){
            aa = 0
        }
        print(aa)
        return aa;
    })
    
    class ShapeChild: Shape
    {
        override func simpleDescription(name: String) -> String{
            return "A shape with (numberOfSides) sides."
        }
        
        var sideLength: Double = 0.0
        var perimeter:Double{
            get{
                return 3.0 * sideLength
            }
            set{
                sideLength = newValue/3.0
            }
        }
        var per:Int = 0{
            willSet{
               print("newValue : (newValue)")
            }
            didSet{
                print("oldValue : (oldValue)")
            }
        }
    }
    
    var triangle = ShapeChild(name:"bb")
    triangle.perimeter
    triangle.perimeter = 9.9
    triangle.sideLength = 4.0
    triangle.perimeter
    triangle.per = 1
    triangle.per = 2
    

    注:1,重写父类方法 用 override关键字 2,属性可以有get set方法,oldValue、newValue是默认参数

    枚举与结构体

    enum Rank: Int {
        case Ace = 1
        case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
        case Jack, Queen, King
        func simpleDescription() -> String {
            switch self {
            case .Ace:
                return "ace"
            case .Jack:
                return "jack"
            case .Queen:
                return "queen"
            case .King:
                return "king"
            default:
                return String(self.rawValue)
            }
        }
    }
    let ace = Rank.Ace
    let aceRawValue = ace.rawValue
    

    注:使用enum来创建一个枚举 rawValue为自动去取方法

    var optionalSquare: Rank? = Rank.Ace
    optionalSquare = nil
    optionalSquare = Rank.Five
    

    注:如果?之前的值是nil,?后面的东西都会被忽略,并且整个表达式返回nil

    enum ServerResponse {
        case Result(String, String)
        case Error(String)
    }
    let success = ServerResponse.Result("6:00 am", "8:09 pm")
    let failure = ServerResponse.Error("Out of cheese.")
    
    switch success {
    case let .Result(sunrise, sunset):
        let serverResponse = "Sunrise is at (sunrise) and sunset is at (sunset)."
    case let .Error(error):
        let serverResponse = "Failure... (error)"
    }
    

    注:一个枚举成员的实例可以有实例值。相同枚举成员的实例可以有不同的值。创建实例的时候传入值即可。
    实例值和原始值是不同的:枚举成员的原始值对于所有实例都是相同的,而且你是在定义枚举的时候设置原始值。

    protocol printSelf{
        var selfStr:String{get}
        mutating func printSelf()
    }
    
    class desk:printSelf{
        var selfStr: String = "a desk"
        
        func printSelf() {
            print(selfStr)
        }
    }
    
    struct phone:printSelf{
        var selfStr: String = "a phone"
        func printSelf() {
            print(selfStr)
        }
    }
    
    desk()
    phone()
    

    注:类、枚举和结构体都可以实现接口。其中类是引用类型,枚举和结构体是值类型
    在值类型的实例方法中,也可以直接修改self属性值。 mutating关键字用来标记一个会修改结构体或枚举属性值的方法

    泛型

    func repeatFunc<T>(item: T, times: Int) -> [T] {
        var result = [T]()
        for _ in 0...times {
            result.append(item)
        }
        return result
    }
    repeatFunc(item:"knock",times:4)
  • 相关阅读:
    CAGradientLayer
    AndroidStudio -- AndroidStuido中找不到cache.properties文件
    logcat -- 基本用法
    UiAutomator -- UiObject2 API
    Android UiAutomator UiDevice API
    Ubuntu 连接手机 不识别设备 -- 解决办法
    Ubuntu Cannot run program "../SDK/build-tools/xxx/aapt": erro = 2 No such file or directory
    Junit4
    Android Studio下运行UiAutomator
    Gradle sync failed: failed to find Build Tools revision 21.1.2
  • 原文地址:https://www.cnblogs.com/yuxiuyi/p/7217000.html
Copyright © 2020-2023  润新知