zoukankan      html  css  js  c++  java
  • Swift基础用法

    <span style="font-size:18px;">// Playground - noun: a place where people can play
    
    import UIKit
    
    //HelloWorld
    var str = "Hello, playground"
    
    //常量可以改变值
    var myVariable = 42
    myVariable = 50
    let myConstant = 42
    
    //指定数据类型
    let floatNumber : Float = 4
    
    //使用强制转换
    let label = "the label is"
    let width = 94
    let lanelwidth = label + String(width)
    
    //使用双引号中的来转换
    let apples = 3
    let oranges = 5
    let appleSummary = "i have (apples) apples"
    let orangeSummary = "i have (oranges) oranges"
    
    //自动识别数据类型加斜杠转换
    let somebody = "Alice"
    let age = 23.5
    let hellosomebody = "(somebody) is (age)"
    
    //数组的初始化以及赋值
    var shoppingList = ["Alice", "Dylan"]
    shoppingList[1] = "Petit Alice"
    
    //字典的初始化以及赋值
    var occupations = [
        
        "male" : "Alice",
        "female" : "Dylan"
    ]
    occupations["male"] = "Alice.Petit"
    
    //初始化一个空的数组或者字典
    let emptyArray = [String]()
    let emptyDictionary = [String : Float]()
    
    //初始化一个自动识别类型的字典或者数组
    let emptyArray_auto = []
    let emptyDictionary_auto = [:]
    
    //控制流 不能省略大括号
    let indivdualScores = [75, 42, 103, 87, 12]
    var teamScore = 0
    for score in indivdualScores {
        if score > 50 {
            teamScore += 3
        } else {
            teamScore += 1
        }
    }
    teamScore
    
    let emptyA = ["key" : "value"]
    emptyA
    
    
    //在if条件中,条件必须是bool表达式 输入一个直接score会出错的
    
    //使用let来标记
    var optionalString : String? = "Hello"
    optionalString == nil
    
    var optionalName : String? = "John Appleseed"
    var getting = "Hello"
    optionalName = nil
    
    if let name = optionalName {
        getting = "Hello, (name)"
    } else {
        getting = "hello, Alice"
    }
    
    //switch
    let vegetable = "red pepper"
    switch vegetable {
    case "celery" :
        let vegetableComment = "add some"
    case "cummber", "watercress" :
        let vegetableComment = "this would make a good tea"
    case let x where x.hasSuffix("papper"):
        let vegetableComment = "is it a spicy (x)"
    default :
        let vegetableComment = "everything tastes good in soup"
    }
    
    //碰到匹配的句子后, switch不会继续往前走
    let interstingNumbers = [
        "prime" : [2, 3, 4, 6],
        "Fibonacci" : [1, 1, 2, 3],
        "Square" : [1, 4, 5]
    
    ]
    var largest = 0
    var maxtype = ""
    for (kind, numbers) in interstingNumbers {
        for number in numbers {
            if number > largest {
                largest = number
                maxtype = kind
            }
        }
    }
    largest
    maxtype
    
    
    
    //while
    var n = 2
    while n < 100 {
        n = n * 2
    }
    n
    var m = 2
    do {
     m = m * 2
    } while m < 100
    m
    //while do 不会多循环一次的 他们是等价的
    
    
    
    
    //...<
    var firstForLoop = 0
    for i in 0..<4 {
        firstForLoop += i
    }
    firstForLoop
    
    var secondForLoop = 0
    for var i = 0; i < 4; i++ {
        secondForLoop += i
    }
    secondForLoop
    
    var thirdForLoop = 0
    for i in 0...4 {
        thirdForLoop += i
    }
    thirdForLoop
    
    //func
    func greet(name: String, day :String) ->String {
        return "Hello, (name), today is (day)"
    }
    greet("Alice", "Tuesday")
    
    
    func whateating(name : String) -> String {
        return "(name) eat what?"
    }
    whateating("Alice")
    
    //使用元组让一个函数返回多个值
    func calculateStatistics(scores:[Int]) ->(min: Int, max : Int, sum : Int) {
        var min = scores[0]
        
        var max = scores[0]
        
        var sum = 0
        
        
        for score in scores {
            if score > max {
                max = score
            }
            if score < min {
                min = score
            }
            sum += score
        }
        return (min, max, sum)
    }
    
    let staticArray = [1, 2, 3, 4, 5]
    calculateStatistics(staticArray)
    //返回值可以用点语法 单独取到 也可以用位置
    calculateStatistics(staticArray).sum
    calculateStatistics(staticArray).0
    
    //函数可以带有可变个数的参数
    func sumOf(numbers : Int...) ->Int {
        var sum = 0
        
        for number in numbers {
            sum += number
        }
        return sum
    }
    sumOf(1, 2)
    sumOf()
    sumOf(1, 2, 3, 4, 5)
    
    //计算参数平均值的联系
    func acr(number : Int...) ->Float {
        var sum = 0
        
        for num in number {
            sum += num
        }
        return Float(sum) / Float(number.count)
    }
    acr(1, 2, 3)
    acr(3, 4)
    
    
    //函数可以嵌套 被嵌套函数可以访问外侧函数的变量 可以嵌套函数来构成一个太长或者太复杂的函数
    func returnFifteen() ->Int {
        var y = 10
        func add() {
            y += 5
        }
        add()
        return y
    }
    returnFifteen()
    
    //函数可以作为另一个函数的返回值
    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, 2, 12]
    hasAnymatches(numbers, lessThanTen)
    
    //函数实际上是一种特殊闭包 使用{} 来创建一个匿名的闭包 使用int将参数和返追只类型声明与闭包函数进行分离
    numbers.map({
        (number: Int) -> Int in
        if number % 2 != 0 {
            return 0
        }
        return 1
    })
    
    let mappedNumbers = numbers.map ({
        number in 3*number
    })
    mappedNumbers
    
    let sortedNumbers = sorted(numbers) {
        $0 > $1
    }
    
    //对象和类
    class Shape {
        var numberOdSides = 0
        
        let testGetNumber = 0
        
        func setNumber(number : Int) {
            numberOdSides = number
        }
        
        func simpleDescription() ->String {
            return "A shape with (numberOdSides) sides"
        }
    }
    
    
    var shape = Shape()
    shape.setNumber(10)
    shape.simpleDescription()
    
    
    
    
    //init
    class NameShape {
        
        var numberOfSides : Int = 0
        var name:String
        
        init(name: String, number: Int) {
            self.name = name
            self.numberOfSides = number
        }
        
        
        
        
        func simpleDescriptin() ->String {
            return "A (name) with (numberOfSides) sides"
        }
        
        
        
    }
    var nameShpe = NameShape(name: "Alice", number: 20)
    nameShpe.simpleDescriptin()
    
    //继承
    
    class Square: NameShape {
        var sidelength: Double
        
        
        init(sidelength: Double, name: String, number: Int) {
            self.sidelength = sidelength
            super.init(name: name, number: number)
        }
        
        
        func area() -> Double {
            return sidelength * sidelength
        }
        
         override func simpleDescriptin() -> String {
            return "a Square with Sides of Length (sidelength)"
        }
        
        
    }
    
    
    
    
    
    //getter  setter
    class EquilaterTrabgle: NameShape {
        
        var sideLengths:Double = 0.0
        
        init(side: Double, name: String, number:Int) {
            self.sideLengths = side
            
            super.init(name: name, number: number)
        }
        
        
        var perimter: Double {
            get {
                return 3 * sideLengths
            }
            
            
            set {
                sideLengths = newValue / 3.0
            }
        }
        
        
        
        override func simpleDescriptin() -> String {
            return "an square triagle with (sideLengths)"
        }
    }
    
    var triangle = EquilaterTrabgle(side: 3.1, name: "Alice", number: 3)
    triangle.perimter
    triangle.perimter = 9.9
    triangle.sideLengths
    triangle.simpleDescriptin()
    
    
    
    //默认情况  方法参数名和他们在方法内部的名字一样
    class counter {
        
        
        var count : Int = 0
        func incrementBy(amount: Int, numberOfTimes times: Int) {
            count += amount * times
        }
    }
    
    
    var count = counter()
    count.incrementBy(2, numberOfTimes: 7)
    
    
    //处理变量可选值的时候 你可以在操作之前加? 之前的值是nil的话 那么后面的东西将不会被执行  否则 ? 后边的东西被运行 这种情况下 整个表达是只有一个可选值
    let optionalSqare: Square = Square(sidelength: 2, name: "Alice", number: 3)
    let sidelength = optionalSqare.sidelength
    
    //枚举和结构体
    enum Rank: Int {
        case Ace = 1
        case Two, Three, Four, Five
        case Jack, Queen
        
        
        func simpleDescription() ->String {
            switch self {
            case .Ace:
                return "ace"
            case .Jack:
                return "jack"
            case .Queen:
                return "queen"
            default:
                return String(self.rawValue)
            }
        }
        
    }
    let ace = Rank.Ace
    let aceRowValue = ace.rawValue
    
    ace.simpleDescription()
    
    
    //写一个函数  来比较两个Rank的值
    enum Ranks:Int {
        case one = 1
        
        case two = 2
        
        case three = 3
        
        
        func sub(number1:Int, number2: Int) ->Int{
            return number1 > number2 ? number1 : number2
        }
    }
    let one = Ranks.one
    
    one.sub(10, number2: 2)
    
    
    //使用toRow 和fromRow函数在原始值和枚举值之间轻松切换
    if let convertedRank = Rank(rawValue: 3) {
        let threeDescription = convertedRank.simpleDescription()
        threeDescription
    }
    
    //枚举的成员是实际值并不是原始值的另一种表达方法 实际上 如果原始之没有意义  你不需要设置
    enum Suit {
        
        case Spades, Hearts, Diamonds, Clubs
        
        func simleDescription() ->String {
            
            switch self {
            case .Spades:
                return "spa"
            case .Hearts:
                return "hearts"
            case .Diamonds:
                return "dia"
            case .Clubs:
                return "clubs"
                
            }
        
    }
    }
    
    let hearts = Suit.Hearts
    
    let heartsDescription = hearts.simleDescription()
    
    //定义一个结构体 接受上边传来的东西
    struct Card {
        var rank : Rank
        
        var suit : Suit
        
        func sipleDescription() -> String {
            return "(rank), (suit)"
        }
    }
    
    let thspeed = Card(rank: .Three, suit: .Spades)
    let thspeeds = thspeed.sipleDescription()
    thspeeds
    thspeed
    
    //通过枚举 却别正确错误信息
    enum ServerResponse {
        case Result(String, String)
        
        case Error(String)
    }
    
    let success = ServerResponse.Result("Alice", "Dylan")
    let failure = ServerResponse.Error("Error")
    
    
    switch success {
        
        
    case let .Result(sunrise, sunset):
        let serverResponse = "(sunrise), (sunset)"
    case let .Error(error):
        let serverResponse = "Failure .. (error)"
    }
    
    
    //协议和扩展
    //首先 使用protocal来声明一个协议
    protocol ExampleRrotocol {
        var simpleDescription: String {
            get
        }
        mutating func adjust()
    }
    
    
    //类 枚举 结构体 都可以实现协议
    class SimoleClass: ExampleRrotocol {
        var simpleDescription: String = "A very petit girl"
        
        var anotherpRroperty: Int = 69105
        func adjust() {
                simpleDescription += "Alice"
        }
    }
    
    var a = SimoleClass()
    a.adjust()
    
    
    let aDescription = a.simpleDescription
    
    struct SimpleStructure : ExampleRrotocol {
        var simpleDescription: String = "Alice"
        
        mutating  func adjust() {
            simpleDescription += ".Dylan"
        }
    }
    
    var b = SimpleStructure()
    b.adjust()
    
    
    
    let bDescription = b.simpleDescription
    </span>
    
    
    
    
    
    

  • 相关阅读:
    java编译错误No enclosing instance of type TestFrame is accessible. Must qualify the allocation with an enclosing instance of type TestFrame (e.g. x.new A(
    java 2中创建线程方法
    动态规划基本思想
    关于eclipse编译一个工程多个main函数
    java Gui初识
    Eclipse中java项目的打包
    java 播放声音
    把资源文件夹导入到eclipse中
    Java建立JProgressBar
    How to grant permissions to a custom assembly that is referenced in a report in Reporting Services
  • 原文地址:https://www.cnblogs.com/chushenruhua/p/4314261.html
Copyright © 2011-2022 走看看