How to loop over struct properties in Swift?

前端 未结 6 1086
情话喂你
情话喂你 2020-12-13 04:16

Is it possible to iterate over properties of a struct in Swift?

I need to register cells-reuse identifiers in a view controller that makes use of many different cel

6条回答
  •  心在旅途
    2020-12-13 04:59

    Here is an example of iterating over struct properties (reuse identifiers of UITableViewCells and the corresponding NIB-names) using Swifts tuple feature. This is useful if you like organizing your cells in nib files and have a UIViewController that makes use of many different cell types.

    struct ReuseID {
      static let prepaidRechargeCreditCell = "PrepaidRechargeCreditCell"
      static let threeTitledIconCell = "ThreeTitledIconCell"
      static let usageCell = "UsageCell"
      static let detailsCell = "DetailsCell"
      static let phoneNumberCell = "PhoneNumberCell"
    
      static let nibNamePrepaidRechargeCreditCell = "PrepaidRechargeCreditCell"
      static let nibNameThreeTitledIconCell = "IconCellWith3Titles"
      static let nibNameUsageCell = "ListElementRingViewCell"
      static let nibNameDetailsCell = "ListElementStandardViewCell"
      static let nibNamePhoneNumberCell = "PhoneNumberCell"
    
      static let allValuesAndNibNames = [
        (ReuseID.prepaidRechargeCreditCell, ReuseID.nibNamePrepaidRechargeCreditCell),          
        (ReuseID.threeTitledIconCell, ReuseID.nibNameThreeTitledIconCell), 
        (ReuseID.usageCell, ReuseID.nibNameUsageCell), 
        (ReuseID.detailsCell, ReuseID.nibNameDetailsCell), 
        (ReuseID.phoneNumberCell, ReuseID.nibNamePhoneNumberCell)]
    }
    

    With that struct it is easy to register all cell types using a for-loop:

    for (reuseID, nibName) in ReuseID.allValuesAndNibNames {
        if let xibPath = NSBundle.mainBundle().pathForResource(nibName, ofType: "nib") {
            let fileName = xibPath.lastPathComponent.stringByDeletingPathExtension
            self.tableView.registerNib(UINib(nibName: fileName, bundle: nil), forCellReuseIdentifier: reuseID)
    
        } else {
            assertionFailure("Didn't find prepaidRechargeCreditCell 

提交回复
热议问题