【问题标题】:Ambiguous reference to member 'Int.init'对成员“Int.init”的模糊引用
【发布时间】:2015-09-22 09:30:11
【问题描述】:

更新到 Xcode7 和 iOS9 后,我在 swift 文件中的“dueDate”:Int(date.timeIntervalSince1970 * 1000) 行的类型转换中收到错误“对成员 'Int.init' 的模糊引用”。请帮帮我。

var date: NSDate! //Declared in the beginning of file
var updatedTask = [
        "description": self.descriptionTextfield.text,
        "title": self.titleTextfield.text,
        "priority": self.priorityTextfield.text!.uppercaseString,
        "type": self.typeTextfield.text!.uppercaseString,
        "dueDate": Int(date.timeIntervalSince1970 * 1000),
        "privacy": self.privateSwitch.on ? "PRIVATE": "PUBLIC"
    ]

【问题讨论】:

  • 这似乎是由您的代码的其他部分引起的,也许是您正在使用的某些库。演员阵容对我来说很好。
  • 不,它与另一个文件无关。
  • "var 日期:NSDate!"在文件上方声明。
  • 正如我所说,这工作正常,所以这一定是由某些框架/库/其他类引起的(例如,扩展声明了另一个与默认值冲突的 Int.init)。您的项目中包含了哪些框架?
  • 有27个框架,我正在使用,其他文件使用相同类型的转换,但错误只出现在这个文件中。在这个文件中,我使用了 import UIKit。

标签: ios swift ios9 xcode7


【解决方案1】:

最少的复制代码是:

var field: UITextField = UITextField()
let dict = [
    "foo": Int(42),
    "bar": field.text
]

这里的问题是UITextField.text的类型:

Xcode6.4:

    var text: String! // default is nil

Xcode7.0:

    public var text: String? // default is nil

ImplicitlyUnwrappedOptional变成Optional

所以上面代码中的字典字面量是有类型的

[
   String: Int,
   String: Optional<String>
]

那么Optional&lt;String&gt; 不能桥接到AnyObject。这就是编译器混淆的原因。

要解决此问题,您必须强制解开 .text 属性:

var updatedTask = [
    "description": self.descriptionTextfield.text!, // <- HERE
    "title": self.titleTextfield.text!, // <- HERE
    "priority": self.priorityTextfield.text!.uppercaseString,
    "type": self.typeTextfield.text!.uppercaseString,
    "dueDate": Int(date.timeIntervalSince1970 * 1000),
    "privacy": self.privateSwitch.on ? "PRIVATE": "PUBLIC"
]

【讨论】:

  • 顺便说一句,奇怪的无关错误信息应该被视为错误。你应该报告给bugreport.apple.com
  • “无法使用类型(字符串)的参数列表调用 'init'”错误在“privacy”:self.privateSwitch.on?“PRIVATE”:“PUBLIC””行。您能否告诉我,如何解决这个问题,因为更新它会在字符串文字出现错误的情况下,因为 privateSwitch 是 IBOutlet。
  • 嗯,我无法重现该错误。 privateSwitchUISwitch 对吗?
  • 是的,privateSwitch 是 UISwitch。
  • 私有开关声明如下 "@IBOutlet weak var privateSwitch: UISwitch!"
【解决方案2】:

需要向编译器提供有关解决我的问题的类型的更多信息。感谢您的帮助。

 var updatedTask : [String : Any] = 
 [
    "description": self.descriptionTextfield.text!, // <- HERE
    "title": self.titleTextfield.text!, // <- HERE
    "priority": self.priorityTextfield.text!.uppercaseString,
    "type": self.typeTextfield.text!.uppercaseString,
    "dueDate": Int(date.timeIntervalSince1970 * 1000),
    "privacy": self.privateSwitch.on ? "PRIVATE": "PUBLIC"
 ]

【讨论】:

    【解决方案3】:

    对于未来的读者,有 2 个问题。首先,您没有告诉编译器您的 Dictionary 包含什么类型的数据([String: Any])。其次,正如 rintaro 指出的那样,文本属性在您的文本字段上是可选的。

    // Tell the compiler about your dictionary
    var updatedTask : [String : Any] = [
        "description": self.descriptionTextfield.text!, // Force unwrap the optional text property
        // rest of dictionary members
    ]
    

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 1970-01-01
      • 2019-11-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 2019-11-17
      相关资源
      最近更新 更多