博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift语法初见
阅读量:5323 次
发布时间:2019-06-14

本文共 5845 字,大约阅读时间需要 19 分钟。

Swift语法初见

类型的声明:

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

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

数值转换:

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

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

let apples = 3let oranges = 5let 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"] = 67788emptyDictionary["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.perimetertriangle.perimeter = 9.9triangle.sideLength = 4.0triangle.perimetertriangle.per = 1triangle.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.Acelet aceRawValue = ace.rawValue

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

var optionalSquare: Rank? = Rank.AceoptionalSquare = niloptionalSquare = 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
(item: T, times: Int) -> [T] { var result = [T]() for _ in 0...times { result.append(item) } return result}repeatFunc(item:"knock",times:4)

转载于:https://www.cnblogs.com/yuxiuyi/p/7217000.html

你可能感兴趣的文章
Hadoop 综合大作业
查看>>
hexo安装
查看>>
python日期及时间格式转换
查看>>
MSP与PSP
查看>>
Android 使用RecyclerView SnapHelper详解
查看>>
Android开发学习:[15]自动导入包
查看>>
Struts2+JFreeChart
查看>>
touch事件记录
查看>>
[C语言 - 9] typedef
查看>>
在100万个数中找到最大的十个数
查看>>
java.io.File中的绝对路径和相对路径
查看>>
spring boot项目升级到2.0.1,提示java.lang.ClassNotFoundException: org.apache.log4j.Logger错误...
查看>>
二、Spring容器使用
查看>>
字符串:格式化 - 零基础入门学习Python015
查看>>
第一个程序 - Windows程序设计(SDK)001
查看>>
二分法原理
查看>>
容器和算法2 - C++快速入门48(完)
查看>>
OpenCV.学习OpenCV.pdf
查看>>
Scala 隐式转换 重要一点 什么是隐式转换以及隐式转换带来的好处
查看>>
依然在路上
查看>>