在 Swift 中将路径字符串转换为对象路径
Convert Path String to Object Path in Swift
struct Student{
var rollNum : Int
var name : String
var contact : Contact
}
struct Contact{
var phoneNum : String
var mailId : String
}
let contact = Contact(phoneNum : "1234567890", mailId : "abcd@xyz.com")
let student = Student(rollNum : 1, name : "John", contact : contact)
此处,邮件 ID 的路径以字符串“Student/contact/mailId”的形式给出。如何将其转换为对象路径 Student.contact.mailId?
假设标签要显示邮件 ID,我会将路径字符串设置为“Student/contact/mailId”,标签应将邮件 ID 显示为 abcd@xyz.com
您的问题可以有多种解决方案。我认为我的解决方案可以让您了解如何解决这个问题。
struct Student {
var rollNum: Int
var name: String
var contact: Contact
}
struct Contact {
var phoneNum: String
var mailId: String
}
func studentInformation(student: Student, paths: [String]) {
print("Student name: \(student.name), RollNumber: \(student.rollNum)")
if paths[0] == "\(Contact.self)" {
contactInformation(contact: student.contact, path: paths[1])
}
}
func contactInformation(contact: Contact, path: String) {
print("Contact phonenumber: \(contact.phoneNum), mailId: \(contact.mailId)")
let contactVariableNameWithValue = Mirror(reflecting: contact).children
for variableName in contactVariableNameWithValue {
if variableName.label == path {
print(variableName.value)
break
}
}
}
let contact = Contact(phoneNum: "1234567890", mailId: "abcd@xyz.com")
let student = Student(rollNum: 1, name: "John", contact: contact)
var pathString = "Student/Contact/mailId"
public let pathComponents = pathString.components(separatedBy: "/")
studentInformation(student: student, paths: Array(pathComponents.suffix(from: 1)))
struct Student {
var rollNum: String
var name: String
var contact: Contact
}
struct Contact {
var phoneNum: String
var mailId: MailId
}
struct MailId {
var official : String
var personal : String
}
let pathString = "Student/contact/mailId/personal"
let pathComponents = pathString.components(separatedBy: "/")
var index : Int = 1
let contact = Contact(phoneNum: "9988998899", mailId: MailId(official: "official@gmail.com", personal: "personal@gmail.com"))
let student = Student(rollNum: "123", name: "John", contact: contact)
Reflection(from: student , pathComponents: pathComponents)
func Reflection(from object : Any, pathComponents : [String]) {
let properties = Mirror(reflecting: object)
for property in properties.children{
if index < pathComponents.count{
if property.label == pathComponents[index] {
index += 1
print(property.value , "got here with label :" , property.label)
Reflection(from: property.value, pathComponents: pathComponents)
}
}
}
}
在这里,我们可以得到值
personal@gmail.com
struct Student{
var rollNum : Int
var name : String
var contact : Contact
}
struct Contact{
var phoneNum : String
var mailId : String
}
let contact = Contact(phoneNum : "1234567890", mailId : "abcd@xyz.com")
let student = Student(rollNum : 1, name : "John", contact : contact)
此处,邮件 ID 的路径以字符串“Student/contact/mailId”的形式给出。如何将其转换为对象路径 Student.contact.mailId?
假设标签要显示邮件 ID,我会将路径字符串设置为“Student/contact/mailId”,标签应将邮件 ID 显示为 abcd@xyz.com
您的问题可以有多种解决方案。我认为我的解决方案可以让您了解如何解决这个问题。
struct Student {
var rollNum: Int
var name: String
var contact: Contact
}
struct Contact {
var phoneNum: String
var mailId: String
}
func studentInformation(student: Student, paths: [String]) {
print("Student name: \(student.name), RollNumber: \(student.rollNum)")
if paths[0] == "\(Contact.self)" {
contactInformation(contact: student.contact, path: paths[1])
}
}
func contactInformation(contact: Contact, path: String) {
print("Contact phonenumber: \(contact.phoneNum), mailId: \(contact.mailId)")
let contactVariableNameWithValue = Mirror(reflecting: contact).children
for variableName in contactVariableNameWithValue {
if variableName.label == path {
print(variableName.value)
break
}
}
}
let contact = Contact(phoneNum: "1234567890", mailId: "abcd@xyz.com")
let student = Student(rollNum: 1, name: "John", contact: contact)
var pathString = "Student/Contact/mailId"
public let pathComponents = pathString.components(separatedBy: "/")
studentInformation(student: student, paths: Array(pathComponents.suffix(from: 1)))
struct Student {
var rollNum: String
var name: String
var contact: Contact
}
struct Contact {
var phoneNum: String
var mailId: MailId
}
struct MailId {
var official : String
var personal : String
}
let pathString = "Student/contact/mailId/personal"
let pathComponents = pathString.components(separatedBy: "/")
var index : Int = 1
let contact = Contact(phoneNum: "9988998899", mailId: MailId(official: "official@gmail.com", personal: "personal@gmail.com"))
let student = Student(rollNum: "123", name: "John", contact: contact)
Reflection(from: student , pathComponents: pathComponents)
func Reflection(from object : Any, pathComponents : [String]) {
let properties = Mirror(reflecting: object)
for property in properties.children{
if index < pathComponents.count{
if property.label == pathComponents[index] {
index += 1
print(property.value , "got here with label :" , property.label)
Reflection(from: property.value, pathComponents: pathComponents)
}
}
}
}
在这里,我们可以得到值
personal@gmail.com