【问题标题】:Swift Compile Error Bitcast requires both operands to be pointer or neitherSwift Compile Error Bitcast 要求两个操作数都是指针或两者都不是
【发布时间】:2014-08-01 22:12:59
【问题描述】:

在 Xcode6 beta 1 中,与此类似的方法有效,但在 Xcode6 beta 4 中出现错误。修复错误后,我的无错误代码如下

用于背景: 我在这里使用的类实现了ABPeoplePickerNavigationControllerDelegate,它允许用户从通讯录中选择一个联系人。我想收到添加到该人的第一封电子邮件。

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,didSelectPerson person: ABRecordRef!) {

    var emails = ABRecordCopyValue(person, kABPersonEmailProperty)
    var emailsObj = emails.takeUnretainedValue() as AnyObject
    var index = 0 as CFIndex
    var emailAddress = ABMultiValueCopyValueAtIndex(emailsObj, index)

    println(emailAddress)
}

但是当我编译时,我得到了构建失败:

Bitcast 要求两个操作数都是指针或两者都不是 %80 = bitcast %objc_object* %79 到 %PSs9AnyObject_, !dbg !860 存储值类型与指针操作数类型不匹配! 存储 %PSs9AnyObject_ %80, %objc_object** %81, 对齐 4, !dbg !860 %objc_object*存储值类型与指针操作数类型不匹配! 存储 %PSs9AnyObject_ %80, %objc_object** %85, 对齐 4, !dbg !864 %objc_object*LLVM 错误:发现损坏的函数,编译中止! 命令 /Applications/Xcode6-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 失败,退出代码为 1

可疑行是:

var emailsObj = emails.takeUnretainedValue() as AnyObject
var emailAddress = ABMultiValueCopyValueAtIndex(emailsObj, index)

当我将代码更改为

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,didSelectPerson person: ABRecordRef!) {

    var emails = ABRecordCopyValue(person, kABPersonEmailProperty)
    var emailsObj:AnyObject? = emails.takeRetainedValue() as AnyObject
    var index = 0 as CFIndex
    var emailAddress = ABMultiValueCopyValueAtIndex(emailsObj, index)

    println(emailAddress)
}

错误缩短为

Bitcast 要求两个操作数都是指针或两者都不是 %79 = bitcast %objc_object* %78 到 %PSs9AnyObject_, !dbg !856 存储值类型与指针操作数类型不匹配! 存储 %PSs9AnyObject_ %79, %objc_object** %80, 对齐 8, !dbg !856 %objc_object*LLVM 错误:发现损坏的函数,编译中止! 命令 /Applications/Xcode6-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 失败,退出代码为 1

提前感谢您的帮助

亚伦

【问题讨论】:

  • 我看到了你对另一个问题的评论,但很遗憾我在这里帮不了你太多。我还没有专门的时间来学习 Swift。但是,这里有一个很长的猜测:如果将takeUnetainedValue() 替换为takeRetainedValue(),它仍然会失败吗?另外,我的操场指示我将emailsObj 行更改为var emailsObj: AnyObject = emails.takeRetainedValue() as AnyObject,这可能与您的问题有关。
  • 遗憾的是这不起作用,但仅供参考,您对 takeUnretained() 和 takeRetainedValue() 之间的区别有什么了解吗?我不太了解文档
  • @Aaron 如果一个函数的名称使用 Create 或 Copy,它会被保留,并且需要释放,所以如果 Swift 有疑问,你告诉它把值作为保留。否则它是不保留的。但是,如果 Swift 没有任何疑问,那么你什么也不应该做。
  • @matt 谢谢,当我将其更改为 var emailsObj:AnyObject? = emails.takeRetainedValue() as AnyObject 时,它似乎减少了输出错误的长度(减少了两行),但只有当我添加 ? 时,其余的错误仍然存​​在即使var emailAddress = ABMultiValueCopyValueAtIndex(emailsObj, index) 被注释掉。
  • 这是一个解决方案 - 但它真的很奇怪:stackoverflow.com/a/24971793/341994 显然这个模块没有很好地桥接到 Swift。你应该坚持使用 Objective-C 和/或提交错误报告。

标签: swift ios8 xcode6


【解决方案1】:
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,didSelectPerson person: ABRecordRef!) {

    var unmanagedEmails = ABRecordCopyValue(person, kABPersonEmailProperty)
    let emailObj: ABMultiValueRef = Unmanaged.fromOpaque(unmanagedEmails.toOpaque()).takeUnretainedValue() as NSObject as ABMultiValueRef

    var index = 0 as CFIndex

    var unmanagedEmail = ABMultiValueCopyValueAtIndex(emailObj, index)
    var emailAddress:String = Unmanaged.fromOpaque(unmanagedEmail.toOpaque()).takeUnretainedValue() as NSObject as String

    println(emailAddress)

}

更完整的答案可以在here找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2018-09-14
    • 1970-01-01
    • 2016-02-29
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多