swift2 – 协议不符合自身?
发布时间:2020-12-14 05:59:13 所属栏目:百科 来源:网络整理
导读:为什么这个Swift 2.0代码不编译? protocol P { }struct S: P { }let arr:[P] = [ S() ]extension Array where Element : P { func testT() - [T] { return [] }}let result : [S] = arr.test() 编译器说:类型P不符合协议P.为什么不?这感觉就像一个洞在语
为什么这个Swift 2.0代码不编译?
protocol P { } struct S: P { } let arr:[P] = [ S() ] extension Array where Element : P { func test<T>() -> [T] { return [] } } let result : [S] = arr.test() 编译器说:类型P不符合协议P.为什么不?这感觉就像一个洞在语言,不知何故。我意识到,该问题源于声明数组arr作为协议类型的数组,但是是不合理的事情吗?我认为协议准确地帮助提供结构类似于类型层次结构。 编辑:Swift 3更准确地重写错误消息:“不支持将”P“用作符合协议”P“的具体类型。
这是另一种metatypes的情况。 Swift真的希望你能得到一个具体的类型为大多数非平凡的东西。 [P]不是一个具体类型(你不能为P分配一个已知大小的内存块)。我不认为有任何证据表明这是一个“不应该”的工作。这看起来非常像他们的“不工作”的情况之一。 (不幸的是,几乎不可能让苹果确认这些情况之间的区别。)Array< P>可以是一个变量类型(其中Array不能)表示他们已经在这个方向做了一些工作,但Swift元类型有很多尖锐的边缘和未实现的情况。我不认为你会得到一个更好的“为什么”的答案。 “因为编译器不允许它。 (不满意,我知道,我的整个Swift生活…)
解决方案几乎总是把东西放在一个盒子里。我们构建一个类型橡皮擦。 protocol P { } struct S: P { } struct AnyPArray { var array: [P] init(_ array:[P]) { self.array = array } } extension AnyPArray { func test<T>() -> [T] { return [] } } let arr = AnyPArray([S()]) let result: [S] = arr.test() 当Swift允许你直接这样做(我最终期望这样做),它可能只是为你自动创建这个框。递归枚举具有这个历史。你不得不把它们封装起来,这是令人难以置信的恼人和限制,然后最终编译器添加间接来做同样的事情更自动。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- [LeetCode118]Valid Number
- ruby – “警告!在使用带有virtualenv的RVM时,没有正确设置
- c# – 使用WebClient.UploadFileAsync方法获取服务器响应
- PostgreSQL数据库操作查找原因以及解决建议
- react-native – React Native Redux – 从asyncstorage初始
- CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQ
- c# – LINQ to XML:忽略属性的情况
- 在sqlite3中查询
- PostgreSQL的EXPLAIN中的“width”字段是什么意思?
- 正则表达式全部符号解释