Swift4中如何将CNPhoneNumber转换为String?
嘿,这个问题我之前也碰到过!你遇到的警告其实很好理解: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
相关产品推荐
相关产品推荐

