2016-06-17 7 views
0

私の関数は、最初の要素がStringで、2番目がUIImageViewオブジェクトである配列を返すようにしたいと思います。例えば。マルチタイプの配列を宣言する

func DoSomething(num:Int) -> Array[String, UIImageView()] { 

    // Each of the following objects in the Array are UIImageView objects   
    Let imageViewObjects = [image1, image2, image3] 

    return [String(num), imageViewObjects[num]] 
} 

しかし、一部のI:私はこのような機能をしたいので、基本的には>

-

["An example string", UIImageView()] 

は、どのように私は、これは次のセクションで返される関数を教えてください私が間違っていることを知っていますか?

Array[String, UIImageView] 

PS私は[ANYOBJECT]使用している場合、それは基本的にはArray[Int]またはArray<Int>ではなくArray[Int]として宣言されていることを型ANYOBJECT

+0

の配列であることを確認する必要があります。単一の 'UIImageView'またはそれらの配列?また、numは 'Int'ですが、' String'として返しています。どちらがいいですか? – ColGraff

+0

'String'と' UIImageView'の1つのセットだけを返していますか? 1つの要素セットだけを返すのであれば、なぜ 'Array'を返すのですか? – ColGraff

答えて

4

注意のオブジェクトを操作傾けるというコードの後半でエラーが発生しますので、私はこれを宣言する必要があります。 [Int]Array<Int>は同じものです。両方を同時に使用する必要はありません。

一番簡単な方法は、タプルを使用している、このように宣言:

(String, UIImageView) 

私はこの(訂正を使用してコード)のようにそれを使用します。

import UIKit 
typealias StringView = (String, UIImageView) 
// Returning an Optional to pass back that num may be out of range 
// note that I'm using the typealias StringView here 
func DoSomething(num:Int) -> StringView? { 
    let image1 = UIImageView() 
    let image2 = UIImageView() 
    let image3 = UIImageView() 
    let imageViewObjects = [image1, image2, image3] 
    // Need to check that num is a valid index 
    guard num < imageViewObjects.count else { return nil } 
    // return the tuple if num is valid 
    return (String(num), imageViewObjects[num]) 
} 

使用例:

if let returned = DoSomething(2) { 
    // printing the first item in returned tuple 
    print(returned.0) 
} 

// output: "2" 

また、プロトコルを使用して共通プロトコルを作成し、それを拡張内のクラスに追加したり、その後、宣言にプロトコルを使用します。

protocol Foo {} 
extension String : Foo {} 
extension UIImageView: Foo {} 
var myArray:[Foo] ... 

あなたはそれが本格的structまたはclassしたいかもしれない多くの場所に返された値を使用するつもりなら:

import UIKit 
struct StringView { 
    let string:String 
    let view:UIImageView 
} 

// Returning an Optional to pass back that num may be out of range 
// note that I'm using the typealias StringView here 
func DoSomething(num:Int) -> StringView? { 
    let imageViewObjects = [UIImageView(), 
          UIImageView(), 
          UIImageView()] 
    // Need to check that num is a valid index 
    guard num < imageViewObjects.count else { return nil } 
    // return the tuple if num is valid 
    return StringView(string: String(num), view: imageViewObjects[num]) 
} 

if let returned = DoSomething(2) { 
    // printing the member "string" in the returned struct 
    print(returned.string) 
} 

// output: "2" 

カスタム構造体とクラスを使用していない限り、通常はタプルが最適です。

+0

'(string:String、view:View)'のようにタプルの各要素に名前をつけて、 'my tuple.string'のようにアクセスするか、最初の要素となるインデックス:mytuple.0を使用します、 'String'です。'typealias'もいいかもしれません:' typealias StringView =(String、UIView) ' - タプルを宣言する必要があるときはいつでも、' StringView'を使うことができます。 – ColGraff

+0

@ Iso1234私は、この例を編集して、それらの 'Array'ではなく単一の' tuple'を返しました。 – ColGraff

1

あなたは、あなたがこの

let imageViewObjects = [image1, image2, image3] 
var array : [AnyObject] = [AnyObject]() 
array.append(String(num)) 
array.append(imageViewObjects[num]) 
のように行うことができる唯一の配列を返すようにしたい場合は、ここであなたが ImageView

let imageViewObjects = [image1, image2, image3] 
let array : [String : UIImageView] = [ 
    String(num) : imageViewObjects[num] 
] 

の配列としてごStringと値としてキーを使用することができ、迅速に辞書オブジェクトを使用することができます

これでは、最初のオブジェクトがStringで、2番目のオブジェクトがUIImageView

関連する問題