gpt4 book ai didi

swift - 不能使用变异成员......因为追加?

转载 作者:可可西里 更新时间:2023-10-31 23:56:10 25 4
gpt4 key购买 nike

我对为什么会收到此错误感到困惑(swift 4.2.1)。

// next, select only entries in range
let filteredDataOpt: [TimeSeriesEntry?] = filteredApps
.map { data in
let isInDate = dates.contains { date in
guard let d = date else {
return false
}
return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
}
return isInDate ? timeSeriesDataFromAppData(data) : nil
}.append(contentsOf: locationsData.map { data in
let isInDate = dates.contains { date in
guard let d = date else {
return false
}
return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
}
return isInDate ? timeSeriesDataFromLocationData(data) : nil
})

这产生

Cannot use mutating member on immutable value: function call returns immutable value

在第三行。

但这不是:

// next, select only entries in range
let filteredDataOpt: [AppData?] = filteredByApps
.map { data in
let isInDate = dates.contains { date in
guard let d = date else {
return false
}
return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
}
return isInDate ? data : nil
}
let filteredData: [AppData] = filteredDataOpt.compactMap { $0 }

我的困惑源于这样一个事实,即我正在使用 append 操作一个序列,而不是先将其分配给一个常量,然后再对其进行 append。为什么我的序列是只读的?

edit: 显然 map 总是(至少乍一看,很奇怪)返回一个常量。总而言之,我的解决方案是:

var filteredDataOpt: [TimeSeriesEntry?] = filteredApps
.map { data in
let isInDate = dates.contains { date in
guard let d = date else {
return false
}
return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
}
return isInDate ? self.timeSeriesData(appData: data) : nil
}
filteredDataOpt.append(contentsOf: self.locationsData.map { data in
let isInDate = dates.contains { date in
guard let d = date else {
return false
}
return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
}
return isInDate ? self.timeSeriesData(locationData: data) : nil
})
let filteredData = filteredDataOpt.compactMap { $0 }

但是,还有其他人觉得这不令人满意吗?我坚持:

  • 中间变量
  • 我需要的只是一个常量的变量

最佳答案

您的问题可以简化为以下内容:

let data = [1, 2, 3]
let data2 = [4, 5, 6]

let filteredData: [Int] = data
.map { $0 }
.append(contentsOf: data2.map { $0 })

解决方案是使用连接而不是append:

let data = [1, 2, 3]
let data2 = [4, 5, 6]

let filteredData: [Int] = data
.map { $0 }
+ data2.map { $0 }

为了解释,这类似于:

let a: Int = 0
let b = a += 1 // this is append
let c = (a + 1) += 1 // this is append with a temporary expression

(您将添加到立即丢弃的内容中,并且该值不会存储到 c 中)。

显然应该这样做

let a: Int = 0
let b = a + 1

请注意,即使您可以 append 临时返回值,append 也没有返回值,并且您的结果分配给 filteredDataOpt 会为 Void

之所以临时表达式是常量(不可变的)是为了防止你犯类似的错误。

关于swift - 不能使用变异成员......因为追加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54217704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com