【问题标题】:Swift convert [String?] to [String!]Swift 将 [String?] 转换为 [String!]
【发布时间】:2016-09-17 13:54:54
【问题描述】:

我在 Swift 3.0 中进行了测试。我想将array1 添加到array2,示例和错误如下:

var array1: [String?] = ["good", "bad"]
var array2 = [String!]()

array2.append(array1)
//Cannot convert value of type '[String?]' to expected argument type 'String!'
array2.append(contentsOf: array1)
//Extraneous argument label 'contentsOf:'in call

我知道如果我换成

var array2 = [String?]()
array2.append(contentsOf: array1)

有效! 如果我不改变类型,我应该如何解决这个问题?

【问题讨论】:

  • array2.append(contentsOf: array1 as [String!]) 呢?
  • 滥用隐式展开可选的好例子。 ;-)
  • 你能解释一下为什么你需要 array2 是隐式解包字符串类型吗?
  • @SamM 其实我只是想试试看是否可以,没有任何特殊原因。

标签: arrays swift swift3


【解决方案1】:

在 Swift 3 中,你不能定义一个数组,其中泛型元素是一个隐式展开的可选元素。

隐式展开的选项只允许在顶层和作为函数结果。

编译器

您可以做的是创建一个新的 String 数组,其中仅包含 array1 的填充元素。

let array1: [String?] = ["good", "bad", nil]
let array2: [String] = array1.flatMap { $0 }

print(array2) // ["good", "bad"]

更新

如 Sam M 所示,这确实是可能的,这是代码

let array2 = array1.map { elm -> String! in
    let res: String! = elm
    return res
}

【讨论】:

  • 请问这里的top level是什么意思?
  • 如果你不能定义一个隐式展开的选项数组,这是怎么工作的? var array = [String!]()array = ["1", "2"]
  • @SamM:非常好的观点。此代码无法编译let array2: [String!] = [String!](),但如果您按照您的建议删除array2 的定义,它确实可以工作let array2 = [String!]()
  • @SamM:我更新了我的答案,谢谢你的贡献。
【解决方案2】:
var array1: [String?] = ["good", "bad"]
var array2 = [String!]()
var array2a = [String]()

for item in array1 {
    array2.append(item)
}
for item in array1 {
    array2a.append(item!)
}
print("1", array1)
print("2", array2)
print("2a", array2a)

打印:

1 [可选(“好”),可选(“坏”)]

2 [好,坏]

2a [“好”,“坏”]

映射也有效,例如:

array2 = array1.map{ $0 }
array2a = array1.filter{ $0 != nil }.map{ $0! }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多