在 Watch App 表中显示字符串数组的问题

Posted

技术标签:

【中文标题】在 Watch App 表中显示字符串数组的问题【英文标题】:Issues with displaying array of strings in Watch App table 【发布时间】:2015-01-14 22:28:19 【问题描述】:

我在包含应用程序和手表应用程序之间传递字符串数组时遇到问题,我之前发布了一个关于收到错误 String is not identical to AnyObject - 'String' is not identical to 'AnyObject' error 的问题

当我发布这个问题时,我是这样声明手表应用程序的数组的:

var tempNames = [""]
var tempAmounts = [""]
var tempDates = [""]

现在我这样声明它们:

var tempNames = []
var tempAmounts = []
var tempDates = []

这解决了另一个错误,但是我现在在另一行收到错误。现在,当我尝试在 TableView 中显示字符串时,我收到错误 'AnyObject' is not convertible to 'String'。这是我的代码:

    for (index, tempName) in enumerate(tempNames) 
        let rowNames = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController

        rowNames.nameLabel.setText(tempName)
    

    for (index, tempAmount) in enumerate(tempAmounts) 
        let rowAmounts = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController

        rowAmounts.amountLabel.setText(tempAmount)
    

    for (index, tempDate) in enumerate(tempDates) 
        let rowDates = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController

        rowDates.dateLabel.setText(tempDate)
    

我在rowNames.nameLabel.setText(tempName) 行收到错误消息。

我哪里错了?

【问题讨论】:

【参考方案1】:

在 Swift 中,数组总是包含明确类型的对象...与 Objective-C 不同,数组不能包含任意对象。因此,您需要声明您的数组将包含字符串。

var tempNames = [String]()
var tempAmounts = [String]()
var tempDates = [String]()

这并不总是很明显,因为在某些工作代码中您不会看到这一点。这是因为如果编译器可以从上下文中推断出您将字符串存储在数组中,那么您可以省略显式类型定义。例如:

var tempNames = ["Sarah", "Seraj", "Luther", "Aroha"]

关于上面的代码,你需要转换as? String

    for (index, tempName) in enumerate(tempNames) 
    let rowNames = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController
    rowNames.nameLabel.setText(tempName) as? String


for (index, tempAmount) in enumerate(tempAmounts) 
    let rowAmounts = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController
    rowAmounts.amountLabel.setText(tempAmount) as? String


for (index, tempDate) in enumerate(tempDates) 
    let rowDates = recentsTable.rowControllerAtIndex(index) as RecentsTableRowController
    rowDates.dateLabel.setText(tempDate) as? String

【讨论】:

感谢您的回复。当我尝试这样做时,我收到将其更改为 [String]() 的建议,但是当我进行更正时,错误 'String' is not identical to AnyObject'` 再次出现在与以前相同的行上。 已更新为当前语法。在原始帖子之前查看了 Apple Swift 书籍以确认我所写的内容是正确的,但在他们为 Swift 更改 API 期间,String[]() 已更改为 [String]() 好的,所以使用您建议的代码,我现在在tempNames = defaults?.objectForKey("namesWatch") as NSArray 行上收到错误'String' is not identical to 'AnyObject',在rowNames.nameLabel.setText(tempName) as? String 行上收到错误'String' is not a subtype of 'Void'。有什么想法吗?

以上是关于在 Watch App 表中显示字符串数组的问题的主要内容,如果未能解决你的问题,请参考以下文章

指针进阶—指针和数组笔试题解析[建议收藏]

如果显示 WKAlert,Watch App 在停用时终止

Ionic app 通知在Moto 360 Watch上显示通知

Apple Watch怎么使用安装APP应用程序

如何将用户从 Apple Watch 通知转移到 Apple Watch App?

AngularJS:$watch不会因对象数组的更改而被触发