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>






原文地址:https://www.cnblogs.com/chushenruhua/p/4314261.html