ios - 应避免强制转换

标签 ios swift casting option-type

我收到“Force cast violation : Force casts should be avoided warning” 在我的代码上:

daysCombinedFinal = daysCombined[0] as! [Any?]

截图如下:

The warning shown is in the image

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if  let cell = tableView.dequeueReusableCell(withIdentifier: "location", for: indexPath) as? TravelShopCustomCell {
        if !isFirstTime && self.nameArray.count != 0 {
            var daysCombined = [Any]()
            var daysCombinedFinal = [Any?]()
            daysCombined = [self.combinedArray[0]]
            daysCombinedFinal = daysCombined[0] as? [Any?] ?? []
            let str = daysCombinedFinal.flatMap { $0 as? String }.joined(separator:" ")
            var startAMCombined = [Any]()
            var startAMCombinedFinal = [Any?]()
            startAMCombined = [self.combinedStartAMArray[0]]
            startAMCombinedFinal = startAMCombined[0] as? [Any?] ?? []
            var endPMCombined = [Any]()
            var endPMCombinedFinal = [Any?]()
            endPMCombined = [self.combinedEndPMArray[0]]
            endPMCombinedFinal = endPMCombined[0] as? [Any?] ?? []
            cell.operatingDaysLabel.text = str
            let isAMEqual = checkArrayStatus(testArray: [startAMCombinedFinal as Any])
            let isPMEqual = checkArrayStatus(testArray: [endPMCombinedFinal as Any])
            if isAMEqual && isPMEqual {
                self.mergedArray = arrayMerger(array1: startAMCombinedFinal, array2: endPMCombinedFinal)
            }
            let startTimeString = self.mergedArray[0] as? String
            let endTimeString = self.mergedArray[1] as? String
            cell.operatingTimeLabel.text = startTimeString! + " - " + endTimeString!
            return cell
        } else if isFirstTime && self.nameArray.count != 0 {
            var daysCombined = [Any]()
            var daysCombinedFinal = [Any?]()
            daysCombined = [self.combinedArray[indexPath.row]]
            daysCombinedFinal = daysCombined[0] as! [Any?]
            let str = daysCombinedFinal.flatMap { $0 as? String }.joined(separator:" ")
            var startAMCombined = [Any]()
            var startAMCombinedFinal = [Any?]()
            startAMCombined = [self.combinedStartAMArray[indexPath.row]]
            startAMCombinedFinal = startAMCombined[0] as! [Any?]
            var endPMCombined = [Any]()
            var endPMCombinedFinal = [Any?]()
            endPMCombined = [self.combinedEndPMArray[indexPath.row]]
            endPMCombinedFinal = endPMCombined[0] as! [Any?]
            cell.operatingDaysLabel.text = str
            let isAMEqual = checkArrayStatus(testArray: [startAMCombinedFinal as Any])
            let isPMEqual = checkArrayStatus(testArray: [endPMCombinedFinal as Any])
            if isAMEqual && isPMEqual {
                self.mergedArray = arrayMerger(array1: startAMCombinedFinal, array2: endPMCombinedFinal)
            }
            let startTimeString = self.mergedArray[0] as? String
            let endTimeString = self.mergedArray[1] as? String
            cell.operatingTimeLabel.text = startTimeString! + " - " + endTimeString!
            return cell
        }
        return cell
    } else {
        fatalError("Dequeueing SomeCell failed")
    }
}

数组声明为:

var dateArray = [Any]()
var endAmTimeArray = [Any]()
var endPmTimeArray = [Any]()
var startAmTimeArray = [Any]()
var startPmTimeArray = [Any]()
var combinedArray = [Any]()
var combinedStartAMArray = [Any]()
var combinedEndPMArray = [Any]()
var mergedArray = [Any?]()

最佳答案

您的问题与“optional”和“unwrapper”的概念有关。下面简要介绍两者及其区别:How to understand ! and ? in swift?

? (Optional) indicates your variable may contain a nil value while ! (unwrapper) indicates your variable must have a memory (or value) when it is used (tried to get a value from it) at runtime.

在您的例子中,您正在尝试使用索引号从数组中获取值。现在数组元素的类型是 'Any'

因此,数组元素可能包含任何类型的值/信息。如果您尝试强制解包元素的值,当它不会返回值或您使用解包器转换的类型的值时,这将导致应用程序崩溃。

Here is basic tutorial in detail, by Apple Developer Committee.

此警告向您表明,您的应用可能会在强制展开可选值时崩溃。

作为解决方案,您应该使用 ? (可选)if-let block ,以避免强制解包和安全执行代码,例如:

if let daysC = daysCombined[0] as? [Any] {
    daysCombinedFinal = daysC
}

分享您的完整源代码,以获得更好的查询解决方案,因为您没有在问题中分享数组声明。因为我对可选数组 [Any?] 元素感到困惑。 Swift 不允许数组元素作为可选元素。

更新:通过将所有数组的元素视为“Dictionary < String : Any >”,此处删除了数组赋值的强制解包。

var daysCombined = [Any]()
var daysCombinedFinal = [Any?]()
daysCombined = [self.combinedArray[indexPath.row]]

// Update 1
// if combinedArray is an array of array
if let arrayElement = daysCombined[0] as? [Any] {
    daysCombinedFinal = arrayElement
}
let str = daysCombinedFinal.flatMap { $0 as? String }.joined(separator:" ")
var startAMCombined = [Any]()
var startAMCombinedFinal = [Any?]()
startAMCombined = [self.combinedStartAMArray[indexPath.row]]

// Update 2
if let arrayElement = startAMCombined[0] as? [Any] {
    startAMCombinedFinal = arrayElement
}
var endPMCombined = [Any]()
var endPMCombinedFinal = [Any?]()
endPMCombined = [self.combinedEndPMArray[indexPath.row]]

// Update 3
if let arrayElement = endPMCombined[0] as? [Any] {
    endPMCombinedFinal = arrayElement
}

cell.operatingDaysLabel.text = str

关于ios - 应避免强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44802181/

相关文章:

ios - 如何测试应用商店购买收据获取原始应用版本

ios - 从第二个警报 View 中按“确定”时,进度平视显示器不显示

ios - ARkit 中 3D 对象上的固定按钮

c - 从没有强制转换的整数生成指针... DS1307、RTC、BCD

C++ 将字符串转换为 unsigned long long

ios - 如何在不重新加载主屏幕的情况下创建滑出式菜单(如 Facebook 应用程序)? (iOS)

ios - UITableView 部分标题与 64 位 iPad 上的行重叠。在 32 位上工作正常

swift - 如何通过 segue 将数据从一个 View Controller 传递到另一个带有 optionals 的 View Controller

ios - 在 swift 中使用 OAuth2 库时总是出现错误 "OAuth2: No authorization context present"

c# - 哪个是首选 : new Nullable<int> or (int? )null?