Swift第三周学习心得

Swift第三周学习心得

第三周主要学习了关于以下几种知识

一、数组的三种重要方法

关于数组的运用有三种重要的方法

1.过滤 (留下满足要求的)

let array = [23, 37, 96, 55, 40, 92, 68, 88]
let newArray = array.filter { (n : Int) -> Bool in
   return n > 50
}
print(newArray)

let newArray2 = array.filter { (n) -> Bool in
    return n % 2 == 0
}
print(newArray2)

关键字-filter

2.映射 (对原来的数组进行你给的要求的变化变成新的数组)

let array = [23, 37, 96, 55, 40, 92, 68, 88]
let newArray3 = array.map { (n : Int) -> Int in
    return n * n
}
print(newArray3)

关键字-map

3.缩减(规约)

let result1 = array.reduce(0, combine: +)   //初始值  缩减(规约)的方法
let result2 = array.reduce(0, combine: *)
let result3 = array[1..<array.count].reduce(array[0]) { $1 > $0 ? $1 : $0 }
print(result3)

关键字-reduce

二、闭包

如果函数的最后一个参数是闭包可以写成尾随闭包的形式
也就是将闭包放到函数参数的圆括号外面写在一对花括号中
如果函数后面有尾随闭包且函数的圆括号中没有参数
那么函数的圆括号也可以省略(仅限于有尾随闭包的场景)
闭包函数有很多种省略的方法

var array = ["game", "abacus", "hello", "cat", "good", "internationalization", "chaos", "dislike", "zealot", "young"]
array.sortInPlace {
    if $0.characters.count == $1.characters.count {
        return $0 < $1
    }
    return $0.characters.count < $1.characters.count
}
print(array)

三、集合

集合与数组一样都是存放数据的方式,但不同的是集合内存放的元素是不能重复的,并且他们的存储也不是按顺序存储的,反而是通过哈希计算随机存储

var b : Set<Int> = [1, 2, 3, 1, 2, 5]   //集合
var c : Set<Int> = [3, 5, 7, 9, 11]
print(b)
print(b.intersect(c))  //交集 b和c都有的
print(b.union(c))      //并集 b和c所有的
print(b.subtract(c))   //差集 b有c没有

遍历集合

for x in b{
    print(x)
}
b.insert(6)          //添加元素
b.remove(2)          //删除元素

四、字典

字典是存放键值对组合的容器
字典中的每个元素都是由两个部分构成,冒号前面是键,后面是值

var dict = ["abacus": "算盘", "abnormal": "异常", "hello": "你好", "good": "很好"]
//key --> value
//通过键值获取对应值(可空类型,因为给的键有可能没有与之对应的值)
print(dict["hello"]) //]后加感叹号,如果找不到值,程序就出错。
//添加元素
dict["shite"] = "嘟嘟"
//删除元素
dict.removeValueForKey("hello") // or dict["hello"] = nil
//修改值就重新赋值
dict["good"] = "不好"
//遍历一个字典
//遍历字典中所有的值
for value in dict.values{
    print(value)
}
//遍历字典中所有的键
for key in dict.keys{
    print("\(key) ---> \(dict[key])")
}
//最常用,通过元组获得字典中的键和值。
for (key, value) in dict{
    print("\(key) ---> \(value)")
}

五、函数

定义一个函数
func 函数名(参数列表) -> 返回类型{函数执行体}
可以给函数的参数设定默认值,如果调用函数的时候没有给该参数赋值就直接使用默认值

func sayhello(personName : String, _ alreadyHello : Bool = false) ->String{  // 可以加默认值
    //let hello = "hello, " + personName + "!"
    //如果函数的返回类型不是void,那么函数中一定有return语句
    //return "hello, " + personName + "!"
    //return hello
    if alreadyHello{
        return "又是你" + personName + "!"
    }
    else {
        return "hello" + personName
    }
}

调用函数,直接写函数名字传参数 -- 函数名(参数组)
调用Swit的函数时,在默认情况下从第二个参数开始需要写参数名

print(sayhello("qqq", true))
//没给第二个参数赋值,直接使用默认你。再写上参数和默认值一样的也可以
print(sayhello("qq"))

//let str = sayhello("qq")
//print(str)


函数的参数名
函数名(外部参数名 内部参数名 : 类型, 外部参数名 内部参数名 : 类型)
如果不写外部参数名,那么内部参数名也就是外部参数名
可以用_来作为外部参数名表示省略外部参数名

func myMin(x : Int, _ y : Int) -> Int{ // 调用不想写y 就在y前面写 _ y 省略外部参数名
    return x < y ? x : y
}
//调用函数写外部参数名
print(myMin(3, 5))


函数的参数列表是可变的,称可变参数列表,函数参数个数是任意个

func sum1(nums: Int...) -> Int{
    var total = 0
    for num in nums{
        total += num
    }
    return total
}
print(sum1())
print(sum(1,2,3))
print(sum1(11,12,12,23,44,56))

六、类

1.定义类(如果你要用的类苹果已经提供了就直接进入第2步)

0.发现类

  • 在对问题的描述里面找名次和动词
  • 名词会成为类或者类中的属性,动词会成为类中的方法

1.定义类

  • 数据抽象(属性)
  • 行为抽象(方法)
  • 初始化方法

访问修饰符

  • public(公开,别的项目也能用)
  • interna(内部的) - 默认
  • private(私有,外界不让访问)
  • 修饰符可以加在类,属性,方法前面,但公开只能先公开类,再公开别的

定义类就可以创建出新的类型

 学生类
class Student {
    // 变量定义到类的外面就叫变量 - variable
    // 变量定义到类的里面就叫属性 - property
    // 数据抽象 - 找到和学生相关的属性(找名词)
    var name: String
    var age: Int
    
    // 初始化方法(构造方法/构造器) - constructor
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    // 函数写到类的外面就叫函数 - function
    // 函数写到类的里面就叫方法 - method
    // 行为抽象 - 找到和学生相关的方法(找动词)
    func eat() {
        print("\(name)正在吃饭.")
    }
    
    func study(courseName: String) {
        print("\(name)正在学习\(courseName).")
    }
    
    func watchJapaneseAV() {
        if age >= 18 {
            print("\(name)正在观看岛国爱情动作片.")
        }
        else {
            print("亲爱的\(name), 我们推荐你观看《熊出没》")
        }
    }
}

步骤2: 创建对象(调用初始化方法)

let stu1 = Student(name: "骆昊", age: 35)

步骤3: 给对象发消息(通过给对象发消息来解决问题)

stu1.eat()
stu1.study("Swift程序设计")
stu1.watchJapaneseAV()

let stu2 = Student(name: "王大锤", age: 15)
stu2.eat()
stu2.study("中国近代史")
stu2.watchJapaneseAV()

类是面对对象编程很重要的部分。在我的理解中,面对对象编程的对象就是通过类具体化得到的。我们说的类事包含很多属性方法的抽象的一个合集,我们从中具体化(创建)一个对象出来对它发消息,消息的内容就是我们希望对象完成的事。

2.创建一个类基本上要经过三个步骤

数据抽象-初始化所有存储属性-行为抽象

class Robot {
    // 数据抽象
    var answer : Int            // 正确答案
    var counter : Int           // 猜的次数
    var hint : String           // 提示信息
    
    //对所有存储属性都要初始化(有初始值,默认值)
    init(){
        answer = Int(arc4random_uniform(100)) + 1
        counter = 0
        hint = ""
    }
    
    // 行为抽象
    // 判断
    func judge(qqq : Int) -> Bool{
        counter += 1
        if qqq < answer{
            hint = "大一点"
        }
        else if qqq > answer{
            hint = "小一点"
        }
        else{
            hint = "恭喜你猜对了!你总共猜了\(counter)次"
            return true
        }
        return false
    }
}

swift里把得到某个值的方法就用名次做方法名,但也能写成如下
通常获得某个计算出来的值的方法都可以设计成计算属性
计算属性(通过对存储属性做运算得到的属性)

3.类的扩展

类的扩展也是很重要的一个部分
扩展,不要改原来的类,神噩梦时候用就在用的地方扩展
如果在某个特定的应用场景中你发现现有的类缺少了某项功能
那么可以通过类的扩展(extension)的方式现场添加这项功能
关键字 extension 类名

extension Point{
   var cgPoint: CGPoint{
       get {
           return CGPointMake(CGFloat(x), CGFloat(y))
       }
   }
}

class Triangle {
   var va: Point
   var vb: Point
   var vc: Point
   var color : UIColor?
   
   init(va : Point, vb: Point, vc: Point){
       self.va = va
       self.vb = vb
       self.vc = vc
   }
   
   var perimeter: Double{
       get{
           let ab = va.distentsTo(vb)
           let bc = vb.distentsTo(vc)
           let ac = vc.distentsTo(va)
           return ab + bc + ac
       }
   }
   
   var area: Double{
       get{
           let ab = va.distentsTo(vb)
           let bc = vb.distentsTo(vc)
           let ac = vc.distentsTo(va)
           let halfp = perimeter / 2
           return sqrt(halfp * (halfp - ab) * (halfp - bc) * (halfp - ac))
       }
   }
   
   func draw(){
       let bezierPath = UIBezierPath()
       bezierPath.moveToPoint(va.cgPoint)
       bezierPath.addLineToPoint(vb.cgPoint)
       bezierPath.addLineToPoint(vc.cgPoint)
       bezierPath.addLineToPoint(va.cgPoint)
      
       //color?.set()
       
//        if let color = color{
//            color.set()
//        }
//        else{
//            UIColor.blueColor().set()
//        }
       
       //let nowcolor = color == nil ? UIColor.blueColor() : color!
       
       //如果为空用??后面的值,不为空就直接用??前面的值,也就是它本身的值
       let currentColor = color ?? UIColor.blueColor()
       currentColor.set()
       
       // 上面写法的升级版
       //(color ?? UIColor.blueColor()).set()
       
       bezierPath.stroke()
   }
}

4.类的继承

从已有的类创建出新类的过程
提供继承信息的类称为父类(超类/基类)
得到继承信息的类称为子类(派生类/衍生类)
通常子类除了得到父类的继承信息还会增加一些自己特有的东西
所以子类的能力一定比父类更强大

继承的意义在于子类可以复用父类的代码并且增强系统现有的功能、

class Student: Person {
    var major: String
    
    init(name: String, age: Int, gender: Gender, major: String){
        self.major = major
        //
        super.init(name: name, age: age, gender: gender)
    }
    
    func study(courseName: String){
        print("\(name)是\(major)专业的学生")
        print("\(name)是\(gender == .Male ? "男" : "女")")
        print("\(name)正在学\(courseName)")
    }
}

我们可以将子类型的对象赋值给父类型的变量(因为子类跟父类之间时is-a关系)
学生是人,老师是人,所以学生和老师的对象可以赋值给人类型的变量

如果要将父类型的变量转换为子类型需要使用as运算符进行类型转换
如果能够确认父类型的变量中就是某子类型的对象可以用as!进行转换
如果不能确定父类型的变量中时那种子类型可以用as?尝试转换

let p2: Person = Student(name: "klle", age: 21, gender: .Female, major: "计算机")
p2.eat()
(p2 as! Student).study("社会学")

if let tmp = p2 as? Teacher{
    tmp.teach("Java")
}
else{
    print("\(p2.name)不是老师!")
}

let p3 = Teacher(name: "ollp", age: 35, gender: .Male, title: "渣渣")
p3.eat()
p3.teach("补到")

注意


if let tmp = p2 as? Teacher

p2是Person类,我们定义一个tmp代表P2,尝试将其转换成tercher类,用If- As?的方法,如果能转,tmp就能调用teacher类的方法那些,不能转换也不影响

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

推荐阅读更多精彩内容