我想让我的函数返回一个数组,其中第一个元素是String,第二个元素是UIImageView对象。 E.g。
["An example string", 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]]
}
但我知道我错了的部分是
Array[String, UIImageView]
P.S。我需要声明这个,因为如果我使用[AnyObject]它会在代码中引发错误,基本上说它不能操作AnyObject类型的对象
答案 0 :(得分:4)
请注意,Array
被声明为[Int]
或Array<Int>
而不是Array[Int]
。 [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"
除非使用自定义结构和类,否则元组通常是更好的选择。
答案 1 :(得分:1)
你可以在swift中使用Dictionary对象,在这里你可以使用key作为String
,将值作为ImageView
的数组
let imageViewObjects = [image1, image2, image3]
let array : [String : UIImageView] = [
String(num) : imageViewObjects[num]
]
如果你想只返回数组,你可以这样做
let imageViewObjects = [image1, image2, image3]
var array : [AnyObject] = [AnyObject]()
array.append(String(num))
array.append(imageViewObjects[num])
在此,你必须确保第一个对象是String
,第二个是UIImageView
的数组