You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift4中如何将CNPhoneNumber转换为String?

解决Cast from 'CNPhoneNumber' to unrelated type 'String' always fails的问题

嘿,这个问题我之前也碰到过!你遇到的警告其实很好理解:CNPhoneNumber和String是完全不相关的类型,直接用as! String强制转换根本行不通,Swift早就预判到这个转换永远会失败,所以才会抛出这个明确的警告。

问题根源

number.value返回的是CNPhoneNumber实例,它不是原生字符串类型,而是一个专门用来存储电话号码信息的对象,所以直接把它当成String强制转换肯定会出问题。

正确的解决方法

CNPhoneNumber类本身提供了一个stringValue属性,专门用来获取电话号码的字符串表示,你只需要调用这个属性就可以了,完全不需要多余的强制转换操作。

修改后的代码如下:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
    contacts.forEach { contact in
        for number in contact.phoneNumbers {
            let phoneNumber = number.value // 这是CNPhoneNumber类型的实例
            let phoneString = phoneNumber.stringValue // 获取字符串形式的电话号码
            print(phoneString)
            numberLabel.text = phoneString // 直接赋值给标签即可
        }
    }
}

额外小提示

如果选中的联系人有多个电话号码,你的原代码最后只会把最后一个号码显示在标签上。如果需要展示所有号码,可以用分隔符把它们拼接起来,比如:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
    var allPhoneNumbers = [String]()
    contacts.forEach { contact in
        // 把所有号码转成字符串后加入数组
        allPhoneNumbers.append(contentsOf: contact.phoneNumbers.map { $0.value.stringValue })
    }
    // 用逗号分隔所有号码并显示
    numberLabel.text = allPhoneNumbers.joined(separator: ", ")
}

内容的提问来源于stack exchange,提问作者user9050369

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:38:35