2017-01-02 54 views
0

我有一個完成塊,將結構數組傳遞給另一個viewcontroller。Swift - 通過塊傳遞結構數組並檢索成員

該數據被接收在viewDidLoad中,如:

var packArray = [Any]()// the block is returning Any 

    override func viewDidLoad() { 
     super.viewDidLoad() 
      BuildArray.buildArrayFromQuery(queryForCollection: "Pack", sender: self) { (result) in  
        self.packArray = [result] 
      } 
    } 

打印此self.packArray返回以下所有在同一行,我現在不知道我怎麼能提取數據。

[[static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk00", description: "This is some text", title: "Not a murderer", image: <PFFile: 0x60000005fc80>, id: "rHITAAHJYk"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk01", description: "This is some text", title: "Addiction", image: <PFFile: 0x600000240300>, id: "uGHHpPF89e"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk02", description: "This is some text", title: "Towels are noisy", image: <PFFile: 0x600000240570>, id: "PeM7hJ4sih"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk03", description: "This is some text", title: "Class action", image: <PFFile: 0x6000002407e0>, id: "LoSXT2PFoS"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk04", description: "This is some text", title: "Beer", image: <PFFile: 0x600000240a50>, id: "vxEsd13twt"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk05", description: "This is some text", title: "Not again...", image: <PFFile: 0x600000240cc0>, id: "JNqaAgtdRb"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk06", description: "This is some text", title: "Foreign cars", image: <PFFile: 0x600000240f30>, id: "Hb16TDXGbz"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk07", description: "This is some text", title: "Skin problems", image: <PFFile: 0x6000002411a0>, id: "MUYDMnJCrU"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk08", description: "This is some text", title: "Junk food", image: <PFFile: 0x600000241410>, id: "yowAfJlcmr"), static ParseStarterProject_Swift.BuildArray.(buildArrayFromQuery (queryForCollection : Swift.String, sender : __ObjC.UIViewController, completeBlock : (Any) ->()) ->()).(collectionStruct #1)(name: "pk09", description: "This is some text", title: "Delusion", image: <PFFile: 0x600000241680>, id: "TiLAKBPmaD")]] 

以前我用的是:

cell.labelCell.text = self.packArray[indexPath.item].packDescription 

但現在返回沒有成員packDescription。我可能會去使用字符串處理和創建一個混亂,但必須有一個更好的方式獲取數據作爲一個實際的數組。我知道我把它作爲任何東西,但無法找出另一種方式從結構數組通過完成塊獲取數據。

----- ---- EDIT

在結果通過completeBlock通過如任何

class func buildArrayFromQuery(queryForCollection: String, 
     sender: UIViewController, 
     completeBlock: @escaping (_ result: Any) -> Void) { 

    struct collectionStruct { 
     var name : String 
     var description : String 
     var title : String 
     var image : PFFile 
     var id: String 
    } 

     var collectionArray = [collectionStruct]() 
其中陣列中創建有一個結構的類,並且從結構 陣列

這是隨後從PFQuery創建,並將所得數組返回通過完成處理

query.findObjectsInBackground(block: { (objects, error) in 

if error != nil { 
    print(error!) 

} else if let packs = objects { 


    for object in packs { 

     print(fromName) 

     print(object) 

     let arrayName = object.object(forKey: fromName) as! String 
     let arrayDescription = object.object(forKey: fromDescription) as! String 
     let arrayTitle = object.object(forKey: fromTitle) as! String 
     let arrayImage = object.object(forKey: fromImage) as! PFFile 
     let arrayID = object.objectId as String! 

     collectionArray.append(collectionStruct(name: arrayName, description: arrayDescription, title: arrayTitle, image: arrayImage, id: arrayID!)) 
    } 

} 


completeBlock(result: collectionArray) 

}) 
+0

您還沒有提供足夠的信息。數組實際包含什麼類型的對象? –

+0

道歉,PFFile和字符串。我將編輯一些更多的帖子... – Pippo

回答

1

你需要轉換的查詢結果所需的類型。如果您packArray一個可選的,你可以直接使用

var packArray: [collectionStruct]? 

self.packArray = result as? [collectionStruct] 

與該代碼分配給它,如果結果不能轉換爲正確的數組類型,self.packArray將包含零。

或者你可以使用可選的結合:

var packArray: [collectionStruct] = [] 

...

if structsArray = result as [collectionStruct] { 
    self.packArray = structsArray 
} 

你應該定義packArray viewDidLoad中之外:

var packArray: [collectionStruct] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    BuildArray.buildArrayFromQuery(queryForCollection: "Pack", 
    sender: self) { 
     (result) in 
     if structsArray = result as [collectionStruct] { 
     self.packArray = structsArray 
    } 
} 

你的代碼定義了一個局部變量packArray在viewDidLoad裏面,這會混淆事物。我建議不要使用同名的實例變量和局部變量。

+0

謝謝你看起來應該工作,仍然有一個小問題,因爲完成塊返回(_結果:(任何)它返回「任何不可轉換爲。 ..collectionStruct「作爲collectionstruct不是一個類型,我不認爲它可以通過完成處理程序 – Pippo

+0

也喜歡collectionStruct是在完成塊所在的類中定義的,在這個類中我們設置packArray沒有collectionStruct – Pippo

+0

你有沒有(或需要)'struct'的初始化工具嗎? – Adrian

0

非常感謝鄧肯C的輸入,不好意思將您的答案標記爲正確,我只是想分享我如何調整它以使其工作。

在類的外部定義了結構,這讓我可以在完成處理程序中使用[collectionStruct]。

struct collectionStruct { 
    var name : String 
    var description : String 
    var title : String 
    var image : PFFile 
    var id: String 
} 

class BuildArray: UICollectionViewController { 

    class func buildArrayFromQuery(queryForCollection: String, 
        sender: UIViewController, 
        completeBlock: @escaping (_ result: [collectionStruct]) -> Void) { 

那麼查詢

completeBlock(collectionArray) 

,然後在其他類作爲鄧肯Ç建議

if let structsArray = result as? [collectionStruct] { 
    self.packArray = structsArray 
} 

這仍然trows後返回數組警告:

"non option expression type [collectionStruct] used in check for optionals" 

如此生病看看我能做些什麼 這裏。