【问题标题】:Command failed due to signal: Segmentation fault: 11 cause由于信号导致命令失败:分段错误:11 原因
【发布时间】:2018-09-14 02:22:50
【问题描述】:

以下代码 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) 导致此错误:由于信号而导致命令失败:分段错误:11 原因

var finalStr = (textField.text! as NSString).replacingCharacters(in: range, with: string) 
if textfield == mobile && finalStr.hasPrefix("0"){ 
textField.text = finalStr.nonZeroNumber 
return false }

var nonZeroNumber:String{
             let local = Double(self)
            return String(format: "%.0f",local!)
 }

代码有什么问题,因为它在示例项目中运行良好。

【问题讨论】:

    标签: swift segmentation-fault uitextfield uitextfielddelegate


    【解决方案1】:

    您在不检查它是否为 nil 的情况下强制展开本地包装,如果您有非数字字符,则可能是这样。

    您要么需要一个默认值,要么更改方法以在失败时返回 nil 并在其他地方检查 nil。

    var nonZeroNumber:String{
        let local = Double(self) ?? 0       // use 0 if Double(self) was nil
        return String(format: "%.0f",local) // local, not local!
    }
    

    var nonZeroNumber: String? {    // note Optional
        guard let local = Double(self) else {
            return nil
        }
        return String(format: "%.0f, local) 
    }
    
    ... 
    textField.text = finalStr.nonZeroNumber ?? "default value"
    

    【讨论】:

    • 无法确定其背后的原因,但如果 textfield == mobile && finalStr.hasPrefix("0") 造成分段错误,则删除 textfield == mobile 检查解决了该问题。
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2015-12-16
    相关资源
    最近更新 更多