为什么这个Swift代码没有编译?
protocol P { }
struct S: P { }
let arr:[P] = [ S() ]
extension Array where Element : P {
func test<T>() -> [T] {
return []
}
}
let result : [S] = arr.test()
Run Code Online (Sandbox Code Playgroud)
编译器说:"类型P不符合协议P"(或者,在Swift的更高版本中,"不支持使用'P'作为符合协议'P'的具体类型.").
为什么不?不知怎的,这感觉就像语言中的漏洞.我意识到问题源于将数组声明arr为协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?
考虑以下扩展:
extension Array where Element == String {
func foo(){
}
}
Run Code Online (Sandbox Code Playgroud)
并考虑我想要拆分的以下字符串,以便我可以使用扩展名...
let string = "This|is|a|test"
let words = string.split(separator: "|")
Run Code Online (Sandbox Code Playgroud)
问题是wordsa[Substring]和 not[String]所以我不能调用foo()它。
那么在 Swift 4 中,如何拆分字符串以返回 a[String]而不是 a [Substring]?
protocol Test{
var t: Int {set get}
}
struct A: Test{
var t: Int
}
struct B: Test{
var t: Int
var s: String
}
let a = A(t: 1)
let b = B(t: 2, s: "1")
let c = a as Test
let d: [Test] = [a, b]
let e: [A] = [a, a]
let f = e as [Test]
let g = e as! [Test]
Run Code Online (Sandbox Code Playgroud)
"让f = e作为[测试],让g = e为![测试]"总是出错.我有一个功能,我必须发送[测试].将A转换为Test易于使用.但是当涉及到Array时,我必须遍历所有数据.有没有什么好方法可以将[A]转换为[Test].