相关疑难解决方法(0)

议定书不符合自己的要求?

为什么这个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协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?

generics swift swift-protocols

117
推荐指数
3
解决办法
1万
查看次数

如何将字符串拆分为 [String] 而不是 [Substring]?

考虑以下扩展:

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]

split swift swift4

10
推荐指数
1
解决办法
1576
查看次数

在Swift中使用协议时键入转换

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].

swift

2
推荐指数
1
解决办法
208
查看次数

标签 统计

swift ×3

generics ×1

split ×1

swift-protocols ×1

swift4 ×1