Swift基础用法

来源:互联网 发布:孔浩 java 编辑:程序博客网 时间:2024/05/20 00:16
<span style="font-size:18px;">// Playground - noun: a place where people can playimport UIKit//HelloWorldvar str = "Hello, playground"//常量可以改变值var myVariable = 42myVariable = 50let myConstant = 42//指定数据类型let floatNumber : Float = 4//使用强制转换let label = "the label is"let width = 94let lanelwidth = label + String(width)//使用双引号中的\来转换let apples = 3let oranges = 5let appleSummary = "i have \(apples) apples"let orangeSummary = "i have \(oranges) oranges"//自动识别数据类型加斜杠转换let somebody = "Alice"let age = 23.5let 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 = 0for score in indivdualScores {    if score > 50 {        teamScore += 3    } else {        teamScore += 1    }}teamScorelet emptyA = ["key" : "value"]emptyA//在if条件中,条件必须是bool表达式 输入一个直接score会出错的//使用let来标记var optionalString : String? = "Hello"optionalString == nilvar optionalName : String? = "John Appleseed"var getting = "Hello"optionalName = nilif let name = optionalName {    getting = "Hello, \(name)"} else {    getting = "hello, Alice"}//switchlet 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 = 0var maxtype = ""for (kind, numbers) in interstingNumbers {    for number in numbers {        if number > largest {            largest = number            maxtype = kind        }    }}largestmaxtype//whilevar n = 2while n < 100 {    n = n * 2}nvar m = 2do { m = m * 2} while m < 100m//while do 不会多循环一次的 他们是等价的//...<var firstForLoop = 0for i in 0..<4 {    firstForLoop += i}firstForLoopvar secondForLoop = 0for var i = 0; i < 4; i++ {    secondForLoop += i}secondForLoopvar thirdForLoop = 0for i in 0...4 {    thirdForLoop += i}thirdForLoop//funcfunc 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).sumcalculateStatistics(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})mappedNumberslet 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()//initclass 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  setterclass 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.perimtertriangle.perimter = 9.9triangle.sideLengthstriangle.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.Acelet aceRowValue = ace.rawValueace.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.oneone.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.Heartslet 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()thspeedsthspeed//通过枚举 却别正确错误信息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.simpleDescriptionstruct SimpleStructure : ExampleRrotocol {    var simpleDescription: String = "Alice"        mutating  func adjust() {        simpleDescription += ".Dylan"    }}var b = SimpleStructure()b.adjust()let bDescription = b.simpleDescription</span>

0 0
原创粉丝点击