斯威夫特3:如何将“自我”称为财产?

时间:2016-12-02 01:59:57

标签: swift swift3

我对Swift 3有疑问。在Swift 3中,我知道我可以这样做:

struct Movie {
    let title = String
    let rottenTomatoesRating = Double
}

但是,假设我创建了一个新的实例:

let StarWars = Movie(title: "Star Wars", rottenTomatoesRating: 97)

有什么方法可以使用变量名称“星球大战”这是实例名称,添加/使用它作为标题属性。我知道在一些编程语言中,有一个“自我”属性。甚至可以在Swift 3中做到这一点吗?

另一个例子是:

struct Song {
    let genre: String
    let songTitle: String
    let artist: String
    let album: String
    var formattedSong: String {
        print("Now playing \(songTitle), \(-------SONG-------) by \(artist).")
    }
}

是否有可能以某种方式引用变量“formattedSong”中的实例名称,如下所示:

let myfavoriteSong = Song.formattedSong
let lastSongIListenedTo = Song.formattedSong

即使这不是最实际的例子,我想知道这是否可行。谢谢阅读。

2 个答案:

答案 0 :(得分:0)

let StarWars = Movie(title: "Star Wars", rottenTomatoesRating: 97)
     

有什么方法可以使用变量名称“星球大战”,即实例名称,添加/使用它作为标题属性

没有。嗯,是的,但只是完全按照你的方式进行。变量 name 不是可以通过运行编程神奇地看到并转换为字符串的东西。

如果您想使用字符串来指定某事物的名称,请使用带字符串键的字典:

var d = [String:Any]()
let title = "Star Wars"
d[title] = Movie(title: title, rottenTomatoesRating: 97)

答案 1 :(得分:0)

属性名称在编译时自然地(由开发人员)给出,因此在编译时没有理由使用这些名称来设置属性本身的 ;这些值可以直接输入。

谨慎行事

对于技术讨论,你可能为此实现非Swift本机hack(但不应该),使用{{1}组合运行时内省使用子类化Mirror,后者构造一个电影容器,可以使用NSObject方法setValue(_:forKeyPath:)设置值。

NSObject
然而,这样做有点疯狂。

内省(上面的import Foundation class Movie: NSObject { var title: String var rottenTomatoesRating: Double init(title: String, rottenTomatoesRating: Double) { self.title = title self.rottenTomatoesRating = rottenTomatoesRating } } class MovieLibrary: NSObject { var starWars = Movie(title: "", rottenTomatoesRating: 4.6) var indianaJones = Movie(title: "", rottenTomatoesRating: 4.2) // ... func setTitlesToPropertyNames() { for case (let label as String, is Movie) in Mirror(reflecting: self).children { self.setValue(label, forKeyPath: label + ".title") } } } var library = MovieLibrary() library.setTitlesToPropertyNames() print(library.starWars.title) // "starWars" print(library.indianaJones.title) // "indianaJones" 部分,而不是 Mirror子类)可能有用,另一方面,如果你只是喜欢检查属性(它们的名称和值),尤其是出于调试目的。