Swift泛型与协议:字典map时$0为何无expectation成员?
解决Swift泛型字典中map方法的使用错误
这个问题我之前也碰到过,本质是对Swift字典的map方法返回值理解有误:当你对[T: HasExpectations]类型的字典调用map时,闭包参数$0并不是字典里的HasExpectations对象,而是一个包含key和value的元组,所以直接访问$0.expectation会触发编译器错误——毕竟元组本身没有expectation这个成员。
两种正确的实现方式
方式1:访问元组的value成员
直接在闭包里通过元组的value属性拿到符合HasExpectations协议的对象,再访问它的expectation属性:
func doit<T>(stuffToExpect: [T: HasExpectations]) { let expectations = stuffToExpect.map({ $0.value.expectation }) }
方式2:先取字典的values集合再map
如果你只关心字典里的HasExpectations类型值,完全可以先通过values属性获取字典所有值的集合(它是一个序列类型,支持map操作),这样闭包参数直接就是HasExpectations对象,代码更直观:
func doit<T>(stuffToExpect: [T: HasExpectations]) { let expectations = stuffToExpect.values.map({ $0.expectation }) }
补充说明
两种方式最终得到的expectations都是[XCTestExpectation]类型的数组,结果完全一致。第二种方式因为跳过了键的部分,代码可读性会更好一些,推荐优先使用。
内容的提问来源于stack exchange,提问作者ablarg
相关产品推荐
相关产品推荐

