Swift 3学习笔记第一篇(语法概览)

1.简单值

let 声明常量,var 声明变量,在变量名后面跟上:类型 来显示声明,不跟的话编译器会根据类型自动做出类型判断
这里写图片描述

/*
 * 1.声明
 */
//: 隐身声明
let interNum = 50

//: 显示声明
let expliceNum :Double = 40

2.字符串拼接

String() 可以显示转换`,或者用反斜杠+()来表示占位符,进行字符串转换

/*
 * 2.字符串拼接
 */
//:1. 字符串拼接(数字转字符串)
let lable = "mmikejing"

let width = 30

let lableWidth = lable + String(width)
print(lable + "\(width)")

//:2.字符串拼接(\())
let xiaoming = 10
let xiaohong = 20
let sumAge = "all ages is \(xiaoming + xiaohong)"

let xiaohei :Double = 99.1
let sumLeave = "xiaohei de age \(xiaohei)"


3.字典和数组创建访问

字典和数组都是用[] 进行包装,字典里面是键值对,[key:value] 数组里面是单个值[value],其中空数组的类型声明可以是[]Array<Int>,值得注意的是字典的声明时[:]Dictionry<String,Int>,后面是逗号隔开,而不是冒号了

//: 1.数组
var shoppingList = ["ta","he","she","her","we"]
print(shoppingList[1])
shoppingList[1] = "666"
print(shoppingList)


//: 2.字典
var dic :Dictionary = ["JSON":20,"LUSIA":30]
print(dic["JSON"]!) // 不加!是optional(20),强行拆包
dic["MKJ"] = 100
print(dic);

//: 3.空数组和空字典的创建
let emptyArray = [String]()  // 类型 + ()
var emptyArray1 = Array<Int>() // 类型 + ()
var emptyArray2:Array<Int> = [] // 显示声明 + 直接[]初始化


let empryDict = [String:Float]() // 类型 + ()
let empryDict1 = Dictionary<String,Float>() // 字典(,分割) + ()
let emtpryDict2:Dictionary<String,Float> = [:]


4.控制流 if else for-in

1.if-else中判断语句一定要是个表达式,不能像OC一样直接写一个例如,if(entity)上去,swift中不支持隐式转换
2.switch可以是任何类型
3.for-in中..< 不包含右区间,... 包含右区间

/*
 * 4.控制流 if switch for-in  while  do while
 */

//: 示例 1   if else
let scroes = [10,50,80,98,17]
var teamScroes = 0
for score in scroes {
    if score > 50 { // ---> if语句中必须是一个bool表达式  不能直接写score,系统不会进行默认的和0判断
        print(score)
        teamScroes += 3
    }
    else
    {
        teamScroes += 1
    }
}
print(teamScroes)


//: 示例 2  let常量的nil判断
var optionStr :String? = "woshiyizhizhu"
print(optionStr == nil)

// requires a contextual type
// let hehe = nil  
// let声明的变量不能为nil,因此可以拿这个点来做if判断,因为swift不可以直接把值弄上去,系统不会自动和0进行比对,一定要给表达式

var optionalStr : String? = "mikejing"
var greeting = "Hello!"
if let name = optionalStr {
    greeting = greeting + optionalStr!
}
else
{
    greeting = greeting + "chengjinjiao"
}
print(greeting)


//: 示例 3 switch支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。
// 声明'let'可用于匹配某部分固定值的模式 这句话有待琢磨。。。
let vagetable = "red tiger"
var vagetaleComment = ""
switch vagetable {
case "hehe":
    vagetaleComment = "add some numb"
case "wuyu":
    vagetaleComment = "that is a pig"
case let x where x.hasPrefix("red"):
    vagetaleComment = "yes get it \(x)"
default:
    vagetaleComment = "done"
}
print(vagetaleComment)

//: 示例 4 for in字典  查找最大值以及对应的key
let interestingNums = ["Prime":[1,2,3,4,5,6,7,40],"Fibonacci":[1,1,2,3,5,8],"Squre":[1,4,9,16,25,36]]
var largest = 0
var largestKey :String? = nil
for (key,value) in interestingNums {
    for num in value {
        if num > largest {
            largest = num
            largestKey = key
        }
    }
}
//print(largestKey! + " + " + String(largest))
print(largestKey! + "+" + "\(largest)")

//: 示例 5 简单的循环使用
// ..<不包含最大   ...包含最大值
var firstForLoop = 0
for i in 0..<4 {
    firstForLoop += i
}
print(firstForLoop)


5.函数

语法:(argv:类型,argv:类型)->(类型)

/*
 * 5.函数
 */
//: 示例1 基本函数
func greet(name:String,today:String,food:String) -> String{
    return "Hello \(name) today is \(today) eat \(food) im very happy"
}

print(greet(name: "MKJ", today: "4月10日", food: "��肉干"))



//: 示例2 利用元祖返回多个值
// 参数的值对应的写法的两种不同表现形式
// 例如是数组  1.scroes:[Int]  2.scroes:Array<Int>
// 例如是字典 1.scroes:[String:Int]  2.Dictionary<String,Int> 注意字典这里用的是逗号,不是冒号
func calculateStatics(scroes:Array<Int>) -> (min:Int , max:Int ,sum:Int)
{
    var min = scroes[0]
    var max = scroes[0]
    var sum = 0
    for sc in scroes {
        if sc > max {
            max = sc
        }
        else if sc < min {
            min = sc
        }
        sum += sc
    }
    return(min,max,sum)
}
let result = calculateStatics(scroes: [1,3,5,45,4])
print("max--->\(result.max),min--->\(result.min),sum--->\(result.sum)" + "--->mikekeing")


6.闭包

1.定义:函数可以被嵌套,被嵌套的函数可以访问外侧函数的变量
2.函数作为返回值() -> ((Int) -> Int) 这里注意的是,3以后参数要加括号,之前貌似不需要加括号

/*
 * 5.闭包  
 * 函数可以被嵌套,被嵌套的函数可以访问外侧函数的变量
 */
//: 示例1 最简单的闭包 函数嵌套
func closure_func () -> Int{
    var x = 0
    func add(){
        x += 10
    }
    add()
    return x
}
print("\(closure_func())")


//: 示例2 函数作为返回值  注意这里需要用函数作为返回值的时候参数一定要用括号,swift2.3的时候貌似不需要多好都行
//: error ---> single argument function types require parentheses
func makeImprove() -> ((Int) -> Int)
{
    func addCount(number:Int) -> Int{
        return number + 2
    }
    return addCount
}

var method = makeImprove()
print("\(method(10))")


//: 示例3 函数作为参数
func hasAnyMatch(list:Array<Int>,condition: (Int) -> Bool) -> Bool
{
    for score in list {
        if condition(score) {
            return true
        }
    }
    return false
}


func largeThan(number:Int) -> Bool
{
    return number > 100
}

var counts = [54,53,67,37,9,75]

print("是否有值大于100--->\(hasAnyMatch(list: counts, condition: largeThan))")

/*
 * 注意:1.闭包就是函数内嵌,内部函数可以访问其外部变量
 *      2.函数作为参数或者作为返回值,表达函数指针的时候一定要把参数类型加上括号,不然就error
 */



闭包的语法以及缩写
1.用{} 来创建闭包
2.内部用in 进行函数声明和函数体的分离{(参数)->(返回值) in 函数体}
3.用$0,$1 来进行函数参数和返回值的和in的省略,直接调用$0函数体 来进行闭包的实现

//: 示例4 函数其实就是一个特殊的闭包,使用{}来创建一个闭包,然后使用in 来分离参数返回值和函数体
let testResult = counts.map { (number:Int) -> Int in
    let result =  3 * number
    return result;
}
print(testResult)

// 示例5 匿名函数体的创建和使用例子 使用$0  $1来省略参数类型返回值和in,保留函数体
let cast = ["Vibim","John","Kibui","Koikis","YiYOLLLLLL"]
let lowcaseNames = cast.map {$0.lowercased()}
print(lowcaseNames)
let lowcaseCount = cast.map {$0.characters.count}
print(lowcaseCount)


// 示例6 正常和缩写的对比
let sortNumber = [1,55,6,3,75,43,73,4,64,66]
let sortedNum = sortNumber.sorted { (a, b) -> Bool in
    return a < b
}
print(sortedNum)


let sortenNum1 = sortedNum.sorted {$0 > $1}
print(sortenNum1)


// 示例7 重写闭包 对所有的奇数返回0
func testOdd(list:[Int]) -> [Int]
{
    var oddList = Array<Int>()
    func isOdd(num:Int) -> (){
        oddList.append(num % 2 == 0 ? num : 0)
    }
    for value in list {
        isOdd(num: value)
    }
    return oddList
}
print(testOdd(list: sortNumber))


7.类与对象的创建

通过class 类名 : 父类名,协议 的语法声明,内部可以有属性,方法,值得注意的时候get和set方法的写法

// 类与对象的创建
// 形状基础类
class BaseShape {
    // 可以声明的时候初始化
    var numberOfSide:Int = 0
    var name:String
    init(name:String) {
        // 也可以析构的时候设置
        self.name = name
    }
    func baseDescription() -> String {
        return "a shape with \(numberOfSide) sides."
    }
}
var shape = BaseShape(name:"base shape")
shape.numberOfSide = 100
print(shape.baseDescription())

// 正方形
class Square : BaseShape{
    var sideLength:Double
    init(sideL:Double,name:String) {
        self.sideLength = sideL
        super.init(name: name)
        numberOfSide = 4
    }
    func areaSquare() -> Double {
        return sideLength * sideLength
    }
    override func baseDescription() -> String {
        return "square shpe with \(self.numberOfSide) sides."
    }
}

var squareShape = Square(sideL:8.8,name:"正方形")
print(squareShape.name + "area-->\(squareShape.areaSquare())  "+squareShape.baseDescription())

// 圆形
class Circle : BaseShape{
    var radi :Double
    init(radi:Double,name:String) {
        self.radi = radi
        super.init(name: name)
        self.numberOfSide = 1000
    }

    func areaCircle() -> Double {
        return 2 * 3.14 * radi * radi
    }

    var perimeter:Double{
        get{
            return 2 * 3.14 * radi * radi
        }
        set{
            self.radi = newValue
        }
    }

    override func baseDescription() -> String {
        return "Circle shpe with \(self.numberOfSide) sides."
    }

}

var circleShape = Circle(radi:5,name:"圆")
print(circleShape.name + "area-->\(circleShape.areaCircle())  "+circleShape.baseDescription())
circleShape.perimeter = 10.0
print(circleShape.name + "area-->\(circleShape.perimeter)  "+circleShape.baseDescription())


8. 枚举

// 枚举
enum Rank:Int{
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack,Queen,Kink
    func comparision(a:Rank) -> Bool {
        return self.rawValue > a.rawValue
    }

    func descriptionSimple() -> String {
        switch self {
        case .Ace,.Two, .Three, .Four, .Five, .Six, .Seven, .Eight, .Nine, .Ten:
            return "ACE"
        case .Jack:
            return "JACK"
        case .Queen:
            return "QUEUE"
        case .Kink:
            return "KINK"
        default:
            return String(self.rawValue)
        }
    }
}

print("左值大于右值?--->\(Rank.Jack.comparision(a: Rank.Six))   " + Rank.Four.descriptionSimple())
Rank.Queen.rawValue // 正向装换
Rank(rawValue:12)?.descriptionSimple() // 逆向转换


// 枚举无非就是指定一个值 一个引用针对某一个值  元祖的参数方式有所不同
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)"
}


9.协议和扩展

// 定义
protocol SomeProtocol {
// 这里是协议的定义部分
}
// 创建
struct SomeStructure: FirstProtocol, AnotherProtocol {
// 这里是结构体的定义部分
}

// 拥有父类的写法
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
// 这里是类的定义部分
}
它只指定属性的名称和类型。此外,协议还指定属性是只读的还是可读可写的。
协议通常用 var 关键字来声明变量属性,在类型声明后加上 { set get } 来表示属性是可读可写的,只读属性则用 { get } 来表示

// 协议的方法要求 不需要大括号和方法体。
protocol RandomNumberGenerator {
func random() -> Double
}


看最简单的示例

protocol sampleProtocol{
    // 任何sampleProtocol类型都得有一个只读的protocolProperty属性,类型为String 不能通过setter进行设值,只getter进行取值 计算类型
    var protocolProperty:String {get}
    // 结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改  mutating
    // 实现协议中的 mutating 方法时,若是类类型,则不用写 mutating 关键字。而对于结构体和枚举,则必须写 mutating 关键字  修改值类型关键字
    mutating func appending()
}

class ExampleEntity : sampleProtocol{
    var protocolProperty: String = "mikejing  "
    // 类是对象属性,有地址,因此可以在方法中直接进行值的修改
    func appending() {
        protocolProperty += "class option protocol"
    }
}
var entityE = ExampleEntity()
entityE.appending()
print(entityE.protocolProperty)

// struct和enum都是值类型,不能在方法中进行属性值得修改,如果需要修改,必须加上mutating关键字
struct StructValue : sampleProtocol{
    var protocolProperty :String = "chengjingjiao  "
    mutating func appending() {
        protocolProperty += "struct option protocol"
    }
}

var structE = StructValue()
structE.appending()
print(structE.protocolProperty)

// 扩展方法 扩展int类型,自增一倍
extension Int : sampleProtocol{
    var protocolProperty: String{
        return "the number \(self)"
    }
    mutating func appending() {
        self += self
    }
}
var intNum = 200
intNum.appending()

extension String {
    var banana : String {
        let shortName = String(characters.dropFirst())
        return "\(self) \(self) you are bitch \(shortName)"
    }
}

let bananaName = "Jimmy".banana





笔记地址,每周更新一点
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值