2016-11-29 4 views
0

I, indem Sie die folgenden eine Reihe von UIImages randomisieren versuchen:Swift 2.2: Mit GKRandomSource mit einer Reihe von UIImages

import UIKit 
import GameplayKit 

//Create an array of the pictures. They are already in xcassets. 

var picturePieces = [UIImage(named: "concordTL"), 
        UIImage(named: "concordTC"), 
        UIImage(named: "concordTR"), 
        UIImage(named: "concordLC"), 
        UIImage(named: "concordC"), 
        UIImage(named: "concordRC"), 
        UIImage(named: "concordBL"), 
        UIImage(named: "concordBC"), 
        UIImage(named: "concordBR")] 

//Randomizer function using GKRandomSource 


func shuffle() { 
var shuffledPicturePieces = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(picturePieces) 

HIER: Ich erhalte die Fehlermeldung „Kann nicht Wert vom Typ umwandeln‚[ UIImage?] 'Zum erwarteten Argumenttyp' [AnyObject] '"im (picturePieces).

Kann GKRandomSource nicht mit UIImage arbeiten?

Ich möchte dann jeder der randomisierten UIImages in shuffledPicturePieces jedem meiner @IBOutlets zuweisen, wie unten dargestellt:

//Outlets for ImageViews. 

@IBOutlet weak var EasyTopLeft: UIImageView! 

@IBOutlet weak var EasyTopCenter: UIImageView! 

@IBOutlet weak var EasyTopRight: UIImageView! 

@IBOutlet weak var EasyLeftCenter: UIImageView! 

@IBOutlet weak var EasyCenter: UIImageView! 

@IBOutlet weak var EasyRightCenter: UIImageView! 

@IBOutlet weak var EasyBottomLeft: UIImageView! 

@IBOutlet weak var EasyBottomCenter: UIImageView! 

@IBOutlet weak var EasyBottomRight: UIImageView! 

//Method to get a picture for the puzzle. 

@IBAction func getPictureButton(sender: UIButton) { 
    shuffle() 

    if EasyTopLeft == nil{ 
     EasyTopLeft.image = shuffledPicturePieces[Int[0]] 
     EasyTopCenter.image = shuffledPicturePieces[Int[1]] 
     EasyTopRight.image = shuffledPicturePieces[Int[2]] 
     EasyLeftCenter.image = shuffledPicturePieces[Int[3]] 
     EasyCenter.image = shuffledPicturePieces[Int[4]] 
     EasyRightCenter.image = shuffledPicturePieces[Int[5]] 
     EasyBottomLeft.image = shuffledPicturePieces[Int[6]] 
     EasyBottomCenter.image = shuffledPicturePieces[Int[7]] 
     EasyBottomRight.image = shuffledPicturePieces[Int[8]] 
    } 


    else{ 
     NSLog("Image already loaded!") 
    } 



} 

HIER: Ich halte den Fehler „Verwendung von ungelösten Kennung‚shuffledPicturePieces‘bekommen "für jeden Eintrag in der IF-Anweisung.

Vielen Dank für Ihre Hilfe!

-Frank

Antwort

0

Ihr erster Fehler:

Cannot convert value of type '[UIImage?]' to expected argument type '[AnyObject]'

geschieht, weil Sie eine Reihe von optionalem Typ eine Funktion sind vorbei, die ein Array von nicht-optionaler Art erwartet. Da Sie „wissen“, diese Bilder in Ihrem Asset-Katalog vorhanden sind, eine einfache Möglichkeit, sie nicht optional zu machen, ist zu zwingen, sie auszupacken (beachten Sie die zugegebene !):

var picturePieces = [UIImage(named: "concordTL")!, 
        UIImage(named: "concordTC")!, 
        // ... 

Alternativ können Sie Fehler behandeln expliziter mit einem funktionalen Programmierstil:

let imageNames = ["concordTL", "concordTC", /*...*/] 
let picturePieces = imageNames.map { name in 
    guard let image = UIImage(named: name) 
     else { fatalError("missing from asset catalog: \(name)") } 
    return image 
} 

Beachten Sie, dass, wenn Sie eine Reihe von Bildern ([UIImage]) haben, können Sie es zu GKRandomSource.arrayByShufflingObjectsInArray, aber die neu gemischt Array verliert Element-Typ-Informationen weitergeben kann - seine Art ist [AnyObject]. Zur Behandlung von ihm als ein Array von Bildern wieder benötigen Sie einen Darsteller:

let shuffledPicturePieces = GKRandomSource.sharedRandom() 
    .arrayByShufflingObjectsInArray(picturePieces) as! [UIImage] 

Ihre zweite Frage:

Use of unresolved identifier 'shuffledPicturePieces'

hat mit Rahmen zu tun. Sie haben ein Array mit der Bezeichnung shuffledPicturePiecesinnerhalb der Funktion shuffle() definiert, so dass der Name nur innerhalb dieser Funktion gültig ist. Innerhalb einer anderen Funktion, wie Ihre getPictureButton, existiert dieser Name nicht.

Wenn Sie möchten, dass shuffledPicturePieces global (oder innerhalb einer Instanz Ihrer Klasse) existiert, machen Sie stattdessen eine Eigenschaft.Zum Beispiel:

class Whatever { 
    let picturePieces = ["concordTL", /*...*/].map { /* as above */ } 
    var shuffledPicturePieces: [UIImage]! 
    func shuffle() { 
     shuffledPicturePieces = GKRandomSource.sharedRandom() 
      .arrayByShufflingObjectsInArray(picturePieces) as! [UIImage] 
     // notice no var or let here — assign to the instance property, 
     // don't create a new local variable 
    } 
    func getPictureButton(sender: UIButton) { 
     // as before 
    } 
} 

By the way, hilft es, die Kommunikation mit anderen, Debuggen und Dinge wie Stack-Überlauf der Syntax-Hervorhebung, wenn Sie Standard-Swift-Namenskonventionen verwenden: Ihre @IBOutlet Variablen Namen mit einem niedrigeren beginnen soll Fallbuchstabe (easyTopLeft, usw.), damit sie nicht mit Typen verwechselt werden.