【问题标题】:"Type String does not conform to protocol StringLiteralConvertible"“类型字符串不符合协议 StringLiteralConvertible”
【发布时间】:2014-07-12 19:40:04
【问题描述】:

我是一名长期的 Obj-C 开发人员,但和其他人一样,我是 Swift 新手,对此我摸不着头脑。我正在尝试转换用 Obj-C 编写的旧教程。

我有一个像这样声明的“动物”类:

class Animal
{
    let title: String
    let image: UIImage
    let creator: String

    init(title: String, image: UIImage, creator: String)
    {
       self.title = title
       self.image = image
       self.creator = creator
    }
}

在另一个类中,我想要一个 Animal 实例数组,它被声明为该类的属性,如下所示:

let animals: [Animal]

并像这样初始化(不成功):

animals = [Animal(title: "Sleeping Cat", image: UIImage.imageNamed("ID-101.jpg") 
creator:"papaija2008"),
...
...
]

我在这个数组初始值设定项的第一行中遇到了一个构建错误,它的内容就像帖子的标题:“Type String 不符合协议 StringLiteralConvertible”。我们不能将字符串文字分配给 String 对象吗?这似乎是不可能的。我违反了什么规则,我该如何解决?

提前致谢!

【问题讨论】:

  • 我经常看到这个错误出现,这通常并不意味着与字符串相关的某些东西是错误的。通常,您传递给函数的某些参数在某种程度上是不正确的。我已经通过为每个相关参数使用带有显式类型的let 然后传入这些变量来解决此类问题。编译器通常会以这种方式给出更有用的错误消息。

标签: swift


【解决方案1】:

使用UIImage(named:) 代替UIImage.imageNamed() 对我有用:

let animals: [Animal] = [Animal(title: "Sleeping Cat", image: UIImage(named: "ID-101.jpg"), creator:"papaija2008")]

我希望它也对你有用。

【讨论】:

  • 成功了,谢谢!我现在意识到 UIImage.imageNamed() 正在调用旧的 Obj-C 方法,该方法当然需要一个 NSString 参数,所以似乎 String 不能隐式转换为 NSString?当然,简单地使用 Swift API 而不是转换更有意义。无论如何,谢谢!
  • 实际上我在操场上看到的错误是imageNamed is unavailable: use object construction UIImage(named:)。顺便说一句,重要的是它解决了你的问题。
  • @ReidBelton 否,StringNSString 是无缝桥接的,这意味着您可以在需要 String 的地方传递 NSString,反之亦然。问题在于 Swift 修改了旧式的 Objective-C 初始化程序以使用其新的构造函数语法。因此,Objective-C 中的 NSThingy.thingyWithName 成为 Swift 中的构造函数,它被调用 NSThingy(name: ...)。您可以查看 UIImage 的文档,了解任何给定方法的 Swift 和 Objective-C 调用有何不同。
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多