swift学习-关联类型,where约束-1/6

挺辛苦的一天。
昨天晚上回家,不知道抽哪门子风,买了一大桶可乐,喝了不少。半夜躺在床上一直睡不着,翻来覆去想各种奇怪的事情,最后终于在早上5点睡着。早上8点半又起来抢火车票,好消息是抢到了。
白天很忙,一直在写一个数据统计的脚本,用python+sql最终实现的。现在想来,还是觉得python的语法最舒服,很多东西很简洁。
今天swift学的还算不错,中午看了30来分钟,下午又看了1个多小时。很平稳的推进过程。
笔记如下:
1 关联类型。
在类型不确定的情况下,需要声明一个或多个关联类型。相当于一个占位名。作为关联类型在协议被实现之前是不需要指定的。关键字:typealias

protocol Container {
    typealias ItemType
    
    mutating func append(item: ItemType)
    
    var count: Int { get }
    subscript(index: Int) -> ItemType { get }
}

struct IntContainer<T>: Container {
    var data = [T]()
    typealias ItemType = T //遵循协议实现类型, 这行可以注释掉,因为swift的类型推断
    
    var count: Int {
        return data.count
    }
    
    mutating func append(item: T) {
        data.append(item)
    }
    
    subscript(index: Int) -> T {
        return data[index]
    }
}

如果一个已有的类已满足协议所有的功能,比如Array就满足Container的所有要求,可以简单的直接声明Array遵循该协议:
extension Array: Container{}
2 where语句类型约束。对于关联类型定义约束是非常有用的。可以使用where语句来定义参数的约束。

func allItemsMatch<C1: Container, C2: Container
    where C1.ItemType  == C2.ItemType, C1.ItemType: Equatable>
    (leftContainer: C1, rightContainer: C2) -> Bool {
    var res = true
    
    if leftContainer.count != rightContainer.count {
        res = false
    } else {
        for i in 0..<rightContainer.count {
            if leftContainer[i] != rightContainer[i] {
                res = false
                break
            }
        }
    }
    
    return res
}

3 访问级别。swift提供了三种访问级别,public,internal,private,基本类似于java的public,包访问权限,private。
默认访问权限为internal。
当开发Framework时,需要把一些实体定义为public级别,这些被定义为public的实体,就是这个Framework的API。
类的访问级别也会影响到类成员(属性,函数,初始化方法)的默认访问级别。如果类声明为private,那么该类所有的成员的默认访问级别也是private。如果将类声明为public或internal或是不明确的指定访问级别,那么该类的所有成员的访问级别是internal
注意:public类的默认访问权限是internal而不是public,如果想将某个成员声明为public,必须明确使用修饰符public。

public class SomePublicClass { //显式的public类
    public var somePublicProperty = 0 //显式的public成员
    var someInternalProperty = 0 //隐式的internal成员
    private func somePrivateMethod() {} //显式的private成员
}

class SomeInternalClass { //隐式的internal类
    var someInternalProperty = 0 //隐式的internal成员
    private var somePrivateProperty = 0 //显式的private成员
}

private class SomePrivateClass { //显式的private类
    var somePrivateProperty = 0 //隐式的private成员
    private func somePrivateMethod() {} //显式的private成员
}

晚上回去必须早点睡。否则明天啥精神都没。还要记得明天早上抢2月5号的票。
最近喜欢上看王垠的文章了。记得很久以前第一次看他写的东西,觉得口气太大,内容空洞。最近又看了不少他的技术类文章,发觉好像变了,成长了不少,算是黑转粉了吧。
高贵的活着。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 扩展 扩展就是向一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类...
    cht005288阅读 3,262评论 0 0
  • 访问控制(Access Control) 本文内容包括: 模块和源文件 访问级别 访问级别的基本原则默认访问级别S...
    果啤阅读 4,911评论 0 1
  • 中文文档 一、模块和源文件 Swift 中的访问控制模型基于模块和源文件这两个概念。 模块指的是独立的代码单元,框...
    伯wen阅读 2,405评论 0 0
  • 时间 会让每个人思考 不用太多的尺量 我们都会成长
    水中鱼写给渴渴的心事阅读 1,735评论 0 1
  • 目标:愿理想伴侣早日与我在一起,微课堂、小海鲜生意大卖。 感恩冥想: 1、感恩今天领导可以又给我协调借调工作的事情...
    小兔兔姐姐爱吃胡萝卜阅读 1,573评论 0 0