【问题标题】:how to print value of object in an array in swift, not its location如何快速打印数组中对象的值,而不是其位置
【发布时间】:2015-12-18 07:02:29
【问题描述】:

我有一个类,其中包含在同一项目中的单独 swift 文件中的某些企业家的数据。

看起来像这样:

class Entrepreneur:NSObject {

var name:String?
var netWorth = (0.0, "")
var company:String?
var summary: [String]
var age: Int?
override init() {
    name = ""
    company = ""
    summary = [""]
    age = 1;

}

在同一个文件中,我有一个返回 NSMutableArray 的函数,其中包含企业家类的实例,如下所示:

func populateArray() -> NSMutableArray {

var entreprenuersArray: NSMutableArray = []

//Mark Zuckerberg
let markZuckerBerg = Entrepreneur()
markZuckerBerg.name = "Mark Zuckerberg"
markZuckerBerg.age = 19
markZuckerBerg.company = "Facebook"
markZuckerBerg.netWorth = (35.7, "Billion")

// add mark zuckerberg object to array
entreprenuersArray.addObject(markZuckerBerg)
print (entreprenuersArray)

在我的 ViewController.swift 文件中,我创建了一个名为企业家的常量,并为其指定了上面创建的“企业家”类的类型,并像这样初始化它:

let entrepreneuerss:Entrepreneur = Entrepreneur()

然后我访问一个类方法,“populateArray”函数并尝试像这样打印企业家数组:

   entrepreneuerss.populateArray()
    print (entrepreneuerss)

问题是打印功能正在打印对象的位置,而不是值......像这样:.Entrepreneur: 0x7f88d0e3ecc0>"

我需要做什么才能返回对象值数组而不是位置。我希望能够从我的 ViewController.swift 文件中访问对象数组并随机选择一个对象并访问其属性。

【问题讨论】:

    标签: ios iphone arrays swift


    【解决方案1】:

    首先,您有一个返回Entrepreneur 对象数组的实例方法(顺便说一句,我没有看到return,也许您忘了复制它)。

    这个方法应该是一个类方法,因为你不使用返回它的Entrepreneur对象的任何属性:

    class func populateArray() -> [Entrepreneur] {
    
        var entreprenuersArray:[Entrepreneur] = []
    
        //Mark Zuckerberg
        let markZuckerBerg = Entrepreneur()
        markZuckerBerg.name = "Mark Zuckerberg"
        markZuckerBerg.age = 19
        markZuckerBerg.company = "Facebook"
        markZuckerBerg.netWorth = (35.7, "Billion")
    
        // add mark zuckerberg object to array
        entreprenuersArray.append(markZuckerBerg)
        print (entreprenuersArray)
    
        return entreprenuersArray
    }
    

    然后你可以通过调用来获得你的数组:

    let array = Entrepreneur.populateArray()
    

    其次,在此方法中,您创建了一个 Entrepreneur 对象数组并将其返回,但在您的示例代码中,您从不使用此数组:

    // Creates a Entrepreneur object with default values
    let entrepreneuerss:Entrepreneur = Entrepreneur()
    
    // create an array of entrepreneurs objects, returns it, but never use it
    entrepreneuerss.populateArray()
    
    // print some information about the object with default values
    print (entrepreneurs)
    

    相反,您应该使用类方法并尝试:

    // create an array of entrepreneurs objects, returns it, 
    let arrayEntrepreneurs = Entrepreneur.populateArray()
    
    // print some information about the array of Entrepreneurs objects
    print (arrayEntrepreneurs)
    

    由于它继承自NSObject,因此为了对您的对象进行详细描述,只需覆盖description 只读属性,以便在您记录对象时自定义文本:

    override var description : String {
        get {
            return "Entrepreneur : name : `\(name) - company : `\(company)` - summary : `\(summary)` - age : `\(age)`"
        }
    }
    

    因此您的打印函数将返回:

    [Entrepreneur : name : `Optional("Mark Zuckerberg") - company : `Optional("Facebook")` - summary : `[""]` - age : `Optional(19)`]
    

    【讨论】:

    • 我进行了更改(使 populateArray func 成为这样的类:class func populateArray() -> [Entrepreneur] { var企业家Array: [Entrepreneur] = [] } 然后我附加每个对象(例如.mark zuckerberg) 到我刚刚创建的数组变量,最后返回 entrepreneurArray。在我的 viewcontroller.swift 文件中,我执行以下操作: Let array = entrepreneuer.populateArray() 正如你提到的,然后我打印数组但是我只是得到一个对象位置的数组而不是它的值..ex: [<.entrepreneur:>, <.entrepreneur:>, <.entrepreneur:>
    • 您是否在 Entrepreneur 类中添加了描述覆盖?
    • 嘿,谢谢迈克尔,它成功了!你能解释一下为什么会这样吗?这个描述变量在做什么?
    • 当您尝试记录或打印对象时,会显示此字符串。默认值是类名,但您可以覆盖它并根据需要使用它:) developer.apple.com/library/mac/documentation/Cocoa/Reference/… 的更多信息
    • 谢谢迈克尔,快速提问:当我们返回包含名称、公司等的数组时,我没有将它包含在问题中,但我还有一个名为 summary 的变量,它是一个包含各种事实的数组关于马克扎克伯格,我能否从企业家数组中的这个“摘要”数组中随机选择一个值?
    【解决方案2】:

    试试

    for element in array {
      print(element)
    }
    

    【讨论】:

      【解决方案3】:

      我需要做什么才能返回对象值数组而不是位置。我希望能够从我的 ViewController.swift 文件中访问对象数组并随机选择一个对象并访问其属性。

      您已经拥有从您的另一个 swift 文件中填充的企业家的所有对象。您可以使用数组中的任何对象并打印它的任何属性。

      如果您仍然想打印所有对象的值或对象的所有属性,那么您需要将名为“description”的属性覆盖到您的模型类中。

      将以下代码添加到您的 Entrepreneur 课程中

      override var description:String { return "name :\(self.name) \n company \(self.company)" }

      上面的代码将打印企业家的任何对象的名称和公司

      【讨论】:

        【解决方案4】:

        也许我在这里遗漏了一些东西,但你可以使用...

        转储(arrayEntrepreneurs)

        给可可

        Swift.dump(arrayEntrepreneurs)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-10
          • 2022-11-22
          • 2015-01-09
          • 1970-01-01
          相关资源
          最近更新 更多