Swift:类 的数组有问题
Swift: trouble with Arrays of classes
我正在尝试创建一个包含两项的数组:一个 URL 和一个字符串。条目索引很重要
数据取自 QuartzFilterManager,它提供有关系统上安装的 Quartz 过滤器的信息。
import Cocoa
import Quartz
class myFilter {
var myURL: URL?
var name: String = ""
}
func getFilters() -> Array<String> {
var filterArray: Array<myFilter>
if let Filters = QuartzFilterManager.filters(inDomains: nil) {
for (index, eachFilter) in Filters.enumerated() {
filterArray[index].name.append((eachFilter as! QuartzFilter).localizedName()!)
filterArray[index].myURL!.append((eachFilter as! QuartzFilter).url()!)
}
}
}
Xcode 抱怨类型 URL 没有附加方法。但是前一行中的名称 属性 有效。简而言之,如何在数组中设置特定属性?
有很多问题。
- 使
myFilter
成为结构而不是 class 并将其正确命名为 MyFilter
.
- 你永远不会初始化你的
filterArray
,你只是声明它。
- 您需要为要添加到数组的每个 url/name 对创建一个
MyFilter
的新实例。
- 在这种情况下您不需要使用
enumerated
。
- 您的
getFilter
函数的 return 类型错误(我认为)。
- 使用正确的命名约定。
这里是清理过的代码:
struct MyFilter {
var myURL: URL?
var name: String
}
func getFilters() -> [MyFilter] {
var filterArray = [MyFilter]()
if let filters = QuartzFilterManager.filters(inDomains: nil) {
for eachFilter in filters {
let filter = MyFilter(myURL: (eachFilter as! QuartzFilter).url(), name: (eachFilter as! QuartzFilter).localizedName()!)
filterArray.append(filter)
}
}
return filterArray
}
还是不太理想。必须使用 as! QuartzFilter
转换 eachFilter
很笨拙。
和 !
的其他用途是不好的。强制展开对 localizedName()
的调用可能会崩溃。考虑适当的解决方案。
Append 是数组结构的方法,而不是 URL/String。
- 你首先需要创建数组(你只是声明它,实际上你需要给它赋值)
- 然后您需要创建要追加到数组中的对象
- 您现在可以将这个新创建的对象追加到数组中
它应该看起来像这样:
import Cocoa
import Quartz
class MyFilter {
var myURL: URL?
var name: String?
init(url: URL?, name: String?) {
self.myURL = url
self.name = name
}
}
func getFilters() -> Array<MyFilter> {
var filterArray = [MyFilter]()
if let filters = QuartzFilterManager.filters(inDomains: nil) {
for filter in filters {
let aFilter = MyFilter(url: filter.url(), name: filter.localizedName())
filterArray.append(aFilter)
}
}
return filterArray
}
现在这个方法返回的数组将有N个MyFilter对象。
您可以像以前一样访问数组中的每个对象,使用
let aFilter = filterArray[index]
并获取该对象内部的 属性:
let url = aFilter.myURL
let name = aFilter.name
PS:我更改了一些名称以符合 swift 约定(类 以 PascalCase 编写,变量以 驼峰式)
PpS:小心 ! in swift,如果它被用在恰好为 nil 的东西上,应用程序会崩溃。阅读更多关于选项 here
PpPs:我只是迟到了几分钟 :D
我正在尝试创建一个包含两项的数组:一个 URL 和一个字符串。条目索引很重要
数据取自 QuartzFilterManager,它提供有关系统上安装的 Quartz 过滤器的信息。
import Cocoa
import Quartz
class myFilter {
var myURL: URL?
var name: String = ""
}
func getFilters() -> Array<String> {
var filterArray: Array<myFilter>
if let Filters = QuartzFilterManager.filters(inDomains: nil) {
for (index, eachFilter) in Filters.enumerated() {
filterArray[index].name.append((eachFilter as! QuartzFilter).localizedName()!)
filterArray[index].myURL!.append((eachFilter as! QuartzFilter).url()!)
}
}
}
Xcode 抱怨类型 URL 没有附加方法。但是前一行中的名称 属性 有效。简而言之,如何在数组中设置特定属性?
有很多问题。
- 使
myFilter
成为结构而不是 class 并将其正确命名为MyFilter
. - 你永远不会初始化你的
filterArray
,你只是声明它。 - 您需要为要添加到数组的每个 url/name 对创建一个
MyFilter
的新实例。 - 在这种情况下您不需要使用
enumerated
。 - 您的
getFilter
函数的 return 类型错误(我认为)。 - 使用正确的命名约定。
这里是清理过的代码:
struct MyFilter {
var myURL: URL?
var name: String
}
func getFilters() -> [MyFilter] {
var filterArray = [MyFilter]()
if let filters = QuartzFilterManager.filters(inDomains: nil) {
for eachFilter in filters {
let filter = MyFilter(myURL: (eachFilter as! QuartzFilter).url(), name: (eachFilter as! QuartzFilter).localizedName()!)
filterArray.append(filter)
}
}
return filterArray
}
还是不太理想。必须使用 as! QuartzFilter
转换 eachFilter
很笨拙。
和 !
的其他用途是不好的。强制展开对 localizedName()
的调用可能会崩溃。考虑适当的解决方案。
Append 是数组结构的方法,而不是 URL/String。
- 你首先需要创建数组(你只是声明它,实际上你需要给它赋值)
- 然后您需要创建要追加到数组中的对象
- 您现在可以将这个新创建的对象追加到数组中
它应该看起来像这样:
import Cocoa
import Quartz
class MyFilter {
var myURL: URL?
var name: String?
init(url: URL?, name: String?) {
self.myURL = url
self.name = name
}
}
func getFilters() -> Array<MyFilter> {
var filterArray = [MyFilter]()
if let filters = QuartzFilterManager.filters(inDomains: nil) {
for filter in filters {
let aFilter = MyFilter(url: filter.url(), name: filter.localizedName())
filterArray.append(aFilter)
}
}
return filterArray
}
现在这个方法返回的数组将有N个MyFilter对象。 您可以像以前一样访问数组中的每个对象,使用
let aFilter = filterArray[index]
并获取该对象内部的 属性:
let url = aFilter.myURL
let name = aFilter.name
PS:我更改了一些名称以符合 swift 约定(类 以 PascalCase 编写,变量以 驼峰式)
PpS:小心 ! in swift,如果它被用在恰好为 nil 的东西上,应用程序会崩溃。阅读更多关于选项 here
PpPs:我只是迟到了几分钟 :D