_ArrayType或_ArrayProtocol在Swift 3.1中不可用吗?

时间:2017-04-11 06:44:07

标签: swift extension-methods swift3.1

当我在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)

1 个答案:

答案 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字节。