我对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
即使这不是最实际的例子,我想知道这是否可行。谢谢阅读。
答案 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
子类)可能有用,另一方面,如果你只是喜欢检查属性(它们的名称和值),尤其是出于调试目的。