1 | /// 实例对象的包装器 |
Swift 关联类型(associatedtype)的使用
定义一个协议时,有时在协议定义里声明一个或多个关联类型是很有用的。关联类型给协议中用到的类型一个占位符名称。直到采纳协议时,才指定用于该关联类型的实际类型。关联类型通过 associatedtype 关键字指定。
举个例子:
1 | protocol Eat { |
我们定义了一个 Person,它每天都得吃饭,我们要求它遵循吃饭的协议 Eat,并实现了其中的 eat 方法。在协议 Eat 中我们声明了一个关联类型 FoodType。当 Person 的实例去调用 eat 方法时,我们使用泛型类型去指定之前的占位符 FoodType,那么我们就能清晰地知道 Person 的实例到底吃的是什么。
1 | let p = Person<Food>() |
Mac 终端配置:fish + omf
安装与配置 fish
根据官网:https://fishshell.com/ 指引安装即可。
安装完之后,使用命令sudo vim /etc/shells
打开配置文件,在文末加上/usr/local/bin/fish
,保存退出。
运行chsh -s /usr/local/bin/fish
命令使fish
成为默认 shell。
使用fish_config
配置主题,这里我选Solarized Dark
。
安装 oh my fish
curl -L https://get.oh-my.fish | fish
安装之后,使用omf install eclm
主题即可。
其它
终端描述文件:
https://github.com/altercation/solarized
下载后导入名为 Solarized Dark ansi
的配置文件。
Cocoapods 1.8.4 CDN 无法使用的问题
好久没升级 Cocoapods 了,正好想升级一下,看到 官方文档 的视频演示,满心欢喜地去试用 CDN 。结果,心灰意冷了。
尝试了很多方法,仍然无法使用卖家秀一样的新特性。更可恨的是,我已经使用了 pod repo remove master
命令了。
经过几个小时的折腾后,放弃了。。。
看到 github 上有人提了同样的 issue ,给出的解决方案是不要使用 trunk,而是继续使用 master 库。希望这个 issue 能早日解决吧~
不得已,删除了 trunk (pod repo remove trunk
),使用 镜像站点 重装了 cocoapods。
由于 Cocoapods 1.8.4 默认使用 CDN 来安装依赖,如果要用回原来的 master 库,需要指定 Podfile 的 source:
1 | # Uncomment the next line to define a global platform for your project |
Socks5 to http
Go Modules
简介
Go modules
是随着 Go 1.11 发布的新型的包管理工具,这也是官方推荐的。有了go mod
,项目将不再依赖于GOPATH
,你可以在任何路径下创建和管理项目,但是下载的依赖包仍然会存储在$GOPATH/pkg/mod
路径。
使用
配置
在 Mac 下,编辑~/.bash_profile
文件,写入export Go111MODULE=on
初始化 Modules
在项目路径下,使用命令 go mod init <packagename>
初始化
编辑 go.mod
初始化的 go.mod 会显示如下内容:
1 | module packagename |
添加依赖后:
1 | module packagename |
如果你不知道要依赖的版本,可以使用 latest
代替版本号,在安装依赖时,go 会自动安装最新的版本。
Go concurrency(并发)
1. 简介
goroutine
是 Go
中的并发执行单位,可以理解为“线程”,但它不是“线程”。生成一个 goroutine
非常简单,只需 go
一下就实现了。在同一个程序中所有的 goroutine
共享一个地址空间。goroutine
通过通信来共享内存,而不是共享内存来通信。
channel
是各个 goroutine
之间通信的管道,它是引用类型,可以使用 ==
进行比较,如果引用了相同的数据结构,则结果为真。传数据用 channel <- data
,取数据用 <- channel
。多数情况下,它是阻塞同步的。channel
可以设置为单向或双向,也可以设置缓存大小,在未被填满前不会发生阻塞。
select
可处理一个或多个 channel
的发送与接收,同时有多个可用的 channel
时按随机顺序处理。
Go reflection(反射)
1. 反射的基本使用
1 | package main |
注意:
User
中的属性必须为大写程序才能正常运行,Go
是根据属性的首字母大小写来确定访问权限的,大写表示公有,小写表示私有。同理,方法签名Hello
为小写,一样无法反射出对应的方法名。