当我在swift 2.1上运行时,我在项目中使用了_ArrayType
。我上周升级到swift 3.0.2(Xcode 8.2.1),我发现_ArrayType
_ArrayProtocol
已更改为Use of undeclared type '_ArrayProtocol'
并且运行良好。
今天我将Xcode升级到8.3.1,它给了我错误:
extension _ArrayProtocol where Iterator.Element == UInt8 {
static func stringValue(_ array: [UInt8]) -> String {
return String(cString: array)
}
}
。这是我的代码:
_ArrayProtocol
现在怎么了?为什么_ArrayProtocol在swift 3.1中未声明,而它在swift 3.0.2中工作。
当我看到here时,我看到_ArrayProtocol可用。
比我调查in git我能够在协议列表中看到'_ArrayType',但在Swift Swift 2.1 docs / 3.0 docs中,我无法看到CREATE TABLE category(
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
parent INT DEFAULT NULL
);
INSERT INTO category VALUES(1,'ELECTRONICS',NULL),(2,'TELEVISIONS',1),(3,'TUBE',2),
(4,'LCD',2),(5,'PLASMA',2),(6,'PORTABLE ELECTRONICS',1),(7,'MP3 PLAYERS',6),(8,'FLASH',7),
(9,'CD PLAYERS',6),(10,'2 WAY RADIOS',6);
SELECT * FROM category ORDER BY category_id;
+-------------+----------------------+--------+
| category_id | name | parent |
+-------------+----------------------+--------+
| 1 | ELECTRONICS | NULL |
| 2 | TELEVISIONS | 1 |
| 3 | TUBE | 2 |
| 4 | LCD | 2 |
| 5 | PLASMA | 2 |
| 6 | PORTABLE ELECTRONICS | 1 |
| 7 | MP3 PLAYERS | 6 |
| 8 | FLASH | 7 |
| 9 | CD PLAYERS | 6 |
| 10 | 2 WAY RADIOS | 6 |
+-------------+----------------------+--------+
10 rows in set (0.00 sec)
。
答案 0 :(得分:2)
以下划线开头的类型名称应始终视为内部。
在Swift 3.1中,它在源代码中标记为internal
,因此
不公开。
在早期的Swift版本中使用_ArrayProtocol
是解决方法
您无法使用"相同类型定义Array
扩展名"需求。
现在可以使用Swift 3.1,如下所述
Xcode 8.3 release notes:
约束扩展允许泛型参数和具体类型之间的相同类型约束。 (SR-1009)
因此不再需要使用内部协议, 你可以简单地定义
extension Array where Element == UInt8 {
}
但请注意,您的static func stringValue()
不需要任何内容
限制元素类型。您可能想要的是什么
像这样定义实例方法:
extension Array where Element == UInt8 {
func stringValue() -> String {
return String(cString: self)
}
}
print([65, 66, 67, 0].stringValue()) // ABC
另请注意,String(cString:)
需要以null结尾的序列
UTF-8字节。