Swift学习笔记之A Swift Tour

Swift1.0的时候一时兴起学习了一下swift的基本语法,现在Swift已经更新到 2.1了,自己吧学到的也忘得差不多了,接下来重新复习一下。

今天先记录一下学习swift初见相关知识点。
微信公众账号lecoding同步更新

1. if 条件语句

//---------------------- 1.1  if 联系 ------------------------/

var optionalString: String?
if let name = optionalString {
    greeting="Hello, \(name)"
}
greeting // Hello

1.2 使用 ?? 取代默认值

let wildcat="lecoding"
print("欢迎关注微信公众账号:\(optionalString ?? wildcat)")

//打印结果:欢迎关注微信公众账号:lecoding

1.3 switch

/*
* 1. Switch 语句必须有Default选项
* 2. 不用加 break, 找到第一个匹配的分支自动结
*
**/
let animal = "wildcat"
switch  animal {
case "dog":
    print("It's a Dog!")
case "cat", "monkey":
    print("its cat or monkey")
case let x where x.hasPrefix("wild"):
    print("It's wild")
case "wildcat":
    print("It is wildcat")
default:
    print("I don't know")
}

//打印结果: It's wild

1.4 for-in

//1. 遍历
let numbersDictionary = [
    "first": [12,23,1,23,34,43],
    "second": [2,23,123,4,43],
    "third": [82,-23,1,23,84,3]
]
var min=Int.max
for (key, numberlist) in numbersDictionary {
    for number in numberlist{
        if number < min{
            min=number
        }
    }
}
print("\(min)")

//打印结果: -23

//2. `..<` 表示范围 , `..< `不包括上界, `...` 包括上界
var count=0
for i in 0..<4 {
    count++
}
print("\(count)")
//打印结果:4
count=0
for i in 0...4 {
    count++
}
print("\(count)")

//打印结果:5

2. 函数

2.1 定义函数

func sayHello (name: String, words: String) -> String {
    return "\(name) say:\" \(words)\"。"
}
sayHello("Lves", words: "欢迎关注公众号:lecoding")

//打印结果: Lves say:" 欢迎关注公众号:lecoding"。

2.2 函数返回多个值

func caculateStatistics(numbers: [Int]) -> (min: Int, max: Int, sum: Int){
    var min = numbers[0]
    var max = numbers[0]
    var sum = 0
    for num in numbers{
        if num > max{
            max = num
        }else if num < min {
            min = num
        }
        sum+=num
    }
    return (min, max, sum)
}

let result = caculateStatistics([23,34,45,4562,-23,0])
print(result.max)  //打印结果:4562
print(result.min)  //打印结果:-23
print(result.2)  //打印结果:4641

swift中,函数支持嵌套,函数既可以当做另一个函数的参数,也可以当做另一函数的返回值
函数也是一种数据类型

2.3 函数嵌套

func functionInFunc() ->Int {
    var num1 = 0
    func add() {
        num1++
    }
    add()
    return num1
}
let result1 = functionInFunc()  // 1

2.4 函数作为返回值

func getSumFunction()->((Int,Int)->Int) {
    func getSum(num1: Int,num2: Int)->Int{
        return num1 + num2
    }
    return getSum  //返回函数名
}
var getSumFun=getSumFunction()  //获得求和函数
let result2=getSumFun(10, 20)
result2   //30

2.5 函数作为参数

//第三个参数是一个函数类型的参数
func compareFunc(num1: Int ,num2 : Int ,paramFunc:(Int,Int)->Int)->Int {
    return paramFunc(num1,num2)
}
//把求和函数传入进行求和
let compareResult=compareFunc(1, num2: 12, paramFunc: getSumFun)
// compareResult = 13

3. 闭包

函数是一种特殊的带有名字的闭包
匿名闭包使用in参数和返回值类型闭包体 分离。

3.1 闭包定义

var numArray1 = [10, 21, 2, 0, 65, 26]
//对数组中的每个元素取反后返回,原数组不会变
let numArray2 = numArray1.map({
    (number:Int) -> Int in
    return -number
})
//注释:数组.map() 对当前数组运用闭包内的规则然后返回一个新的数组
print(numArray1, numArray2)

打印结果: [10, 21, 2, 0, 65, 26] [-10, -21, -2, 0, -65, -26]

3.2 闭包简写

如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型返回值。单个语句闭包会把它语句的值当做结果返回。
上边的闭包你也可以写成下面这样:

let numArray3 = numArray1.map({number in
    return -number
})

print(numArray1, numArray3)

打印结果: [10, 21, 2, 0, 65, 26] [-10, -21, -2, 0, -65, -26]

你可以通过 参数位置 而不是参数名字来引用参数——这个方法在非常短的闭包中非常有用。
当一个闭包作为最后一个参数传给一个函数的时候,它可以直接跟在括号后面。当一个闭包是传给函数的唯一参数,你可以完全忽略括号。

//数组排序
let sortedNumbers = numArray1.sort { $0 > $1 }
print(sortedNumbers)

打印结果: [65, 26, 21, 10, 2, 0]

4. 对象和类

1.定义Person类


class Person {
    // MARK: - Properties
    ///姓名
    var name: String
    ///年龄
    var age:Int?
    let hasParants:Bool = true
    
    // MARK: - Lifecycle
    //构造函数
    init(name: String){
        self.name = name
    } 
    // MARK: - Private
    func sayHello() ->String{
        return "Hello, My Name is \(name),欢迎关注微信公众账号:lecoding。iOS开发文章实时更新!"
    }
}

var per1 = Person(name: "Lves")
per1.age=24
var sayHi = per1.sayHello()
//"Hello, My Name is Lves,欢迎关注微信公众账号:lecoding。iOS开发文章实时更新!"

2. 定义Person的子类


class Student: Person {
    var className: String
    init(name: String, className: String) {
        self.className=className
        super.init(name: name)
        age = 20
    }
    
    override func sayHello() -> String {
        return "I am a Student From class \(className)"
    }
}

var stu = Student(name: "Lves", className: "一年级")
stu.age        //20
stu.sayHello() //"I am a Student From class 一年级"


class Square {
    var width : Float = 0.0
    
    var perimeter: Float{
        get {
            return 4*width
        }
        
        set {
            width = newValue/4.0
        }
    }
    
}

5. 枚举和结构体

5.1 枚举

//1. 在swift中枚举可以包含方法
enum WeekType {
    case Mon
    case Tue, Wed, Thu, Fri
    case Sat, Sun
    
    func myDescription () -> String{
        switch self {
        case .Mon:
            return "Monday"
        case .Tue:
            return "Tuesday"
        case .Wed:
            return "Wednesday"
        case .Thu:
            return "Thursday"
        case .Fri:
            return "Friday"
        case .Sat:
            return "Saturday"
        case .Sun:
            return "Sunday"
        }
    }
}
let weekday = WeekType.Thu              // Thu
let desc = weekday.myDescription()      // "Tuesday"

//枚举定义了类型之后,可以使用 .rawValue 查看原值
enum FromControllerType: String {
    case First = "FirstController"
    case Second = "SecondController"
}
let from = FromControllerType.First     // First
print(from.rawValue)
//打印结果:"FirstController"

5.2. 结构体

使用struct来创建一个结构体。结构体和类有很多相同的地方,比如方法和构造器。它们之间最大的一个区别就是结构体是传值,类是传引用

struct Week {
    var weekday : WeekType
    func myDescription() ->String {
        return "My Weekday is \(weekday.myDescription())"
    }
    
}

let structVar = Week(weekday: .Fri)
structVar.myDescription()     // "My Weekday is Friday"

6. 协议和扩展

6.1. 协议

protocol DescriptionProtocal {

    var simpleDescrition: String { get }
    mutating func adjust()
}

类、枚举、结构体都可以实现协议
类实现协议

class DescripClass: DescriptionProtocal {
    var simpleDescrition:String {
        return "I'm a Class"
    }
    func adjust() {
    
    }
}

结构体实现协议

注意:声明SimpleStructure时候mutating关键字用来标记一个会修改结构体的方法。SimpleClass的声明不需要标记任何方法,因为类中的方法通常可以修改类属性(类的性质)。

struct DescripStruct: DescriptionProtocal {
    var simpleDescrition: String = "I'm a Struct"
    mutating func adjust() {
        simpleDescrition += "123"
    }
}
var structConformProtocal = DescripStruct()
structConformProtocal.adjust()
structConformProtocal.simpleDescrition // "I'm a Struct123"

枚举实现协议

enum DescripEnum: DescriptionProtocal {
    case Success, Error
    
    var simpleDescrition: String {
        get {
            switch self {
            case .Success:
                return "You are Success"
            case .Error:
                return "You are Failure"
            }
        }
    }
    func adjust() {
    }
}
var enumConformProtocal = DescripEnum.Success
enumConformProtocal.simpleDescrition  //"You are Success"

protocol AbsoluteProtocal {
    mutating func absolute() -> Double
}

6.2 扩展

使用extension来为现有的类型添加功能,比如新的方法和计算属性。你可以使用扩展在别处修改定义,甚至是从外部库或者框架引入的一个类型,使得这个类型遵循某个协议。

//拓展 Double 类型同时实现 DescriptionProtocal、AbsoluteProtocal 两个协议

extension Double:DescriptionProtocal,AbsoluteProtocal {
    var test:String{
        return "demo"
    }
    var simpleDescrition:String {
        return "The double value is: \(self)"
    }
    mutating func adjust() {
        self = -self
    }
    mutating func absolute() ->Double {
        return abs(self)
    }
}

var doubleNumber:Double = 12.5
doubleNumber.simpleDescrition       //"The double value is: 12.5"
doubleNumber.adjust()               // -12.5

var oriNumber:Double = -100
var resultDouble=oriNumber.absolute()  //取反
resultDouble                // 100

oriNumber.test              // "demo"

7. 泛型

enum optionalValue<Type> {
    case none
    case other(Type)
}

var enumOfInt:optionalValue<Int> = .none
enumOfInt = .other(12)
print(enumOfInt)

打印结果:other(12)

func anyCommonElements <T: SequenceType, U: SequenceType where T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, _ rhs: U) -> Bool {
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                return true
            }
        }
    }
    return false
}
anyCommonElements([1, 2, 3], [3])

转载请注明原文链接:http://lvesli.com/2016/05/25/A-Swift-Tour/
微信公众账号同步更新:lecoding,你也可以扫描下方二维码:

qrcode_for_gh_af22362bf4bb_258.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容