gpt4 book ai didi

ios - 我知道在 Swift 的变量中使用变量是不行的……但是

转载 作者:行者123 更新时间:2023-11-29 01:52:35 25 4
gpt4 key购买 nike

好的。新手在这里。我试图在变量中使用变量,最后在这里进行了一些搜索,并意识到这是不行的......但也许有人可以帮助我想出一种不同的方法来做到这一点。

再说一次,也许我在处理这个问题时思考不正确,所以请随意笑、取笑或撕扯我。 :)

我有 4 个 UIButton

@IBOutlet var westButton: UIButton!
@IBOutlet var northButton: UIButton!
@IBOutlet var southButton: UIButton!
@IBOutlet var eastButton: UIButton!

当单击一个位置时,我试图访问一类位置来加载下一个位置。例如。

class Place {
var Name: String = ""
var northDirection: String = ""
var southDirection: String = ""
var eastDirection: String = ""
var westDirection: String = ""

init (Name: String, northDirection: String, southDirection: String, eastDirection: String, westDirection: String) {
self.Name = Name
self.northDirection = northDirection
self.southDirection = southDirection
self.eastDirection = eastDirection
self.westDirection = westDirection

}

......

        let Home = Place (Name: "Home", northDirection: "North", southDirection: "South", eastDirection: "East", westDirection: "Park")
let Park = Place (Name: "Park", northDirection: "North", southDirection: "South", eastDirection: "Home", westDirection: "West")

我在 IBAction 中所做的就是尝试获取当前的“位置”并从其类中获取相应的位置。例如,从“Home”开始获取 home.westDirection 将是 Park,但希望将 Park 的 westDirection 值加载到按钮中的下一个标题。

我希望使用诸如按下西按钮时获取其标题之类的东西。 (我试图将按钮的新标题设置为按钮标题类中的 .westDirection 值。(上面的示例,从 Home 位置按 westButton 将返回 Park。

 westButton.setTitle(("\(westButton.currentTitle!).westDirection"), forState: UIControlState.Normal)

当然,上面返回...“Park.westDirection”,因为它是一个字符串。我正在尝试使用它来尝试获取变量中的变量。

我想我必须回到绘图板,也许离开一个类(class),我只是希望 IBAction 能够自动填充类(class)中的值。 (也许我想得太像perl)我不知道。有人有什么想法可以帮助我以不同的方式解决这个问题吗?

最佳答案

在 Swift 中,强类型意味着你必须以完全不同的方式来处理这个问题。首先,如果你有一个类型,其中包含对其他类型的引用,这意味着 Swift 中的递归(“变量中的变量”)。而且,由于这种情况不太适合递归,这将意味着令人头痛。举个例子,对这样的 map 进行编码:

 ___ ___
| a | b |
|___|___|
| c | d |
|___|___|

使用递归会涉及到:

class Place { var north, east, south, west: Place? }

var (a, b, c, d) = (Place(), Place(), Place(), Place())

(a.east, a.south) = (b, c)
(b.west, b.south) = (a, d)
(c.north, c.east) = (a, d)
(d.north, d.east) = (b, c)

现在,这给了你你想要的行为(某种程度)。如果您查找 a 南边的内容,只需使用它的属性即可:

a.south

您还可以添加您需要的任何其他属性。 (比如名字)。但是,能够通过名称访问这些地点需要字典:

let places = ["Home":a, "Work": b, "Gym":c, "Pub":d]

然后你可以像这样访问事物本身的名称:

places["Home"]?.south?.someProperty

其中 someProperty 是您感兴趣的 Place 类的属性。但是,如您所见,这非常乏味且麻烦。有很多重复。 (例如,您必须说 a.east = b 以及 b.west = a)更好的方法是采用表示 map 的数据结构, 然后通过它访问你想要的东西。这是我管理的内容:

struct Map {

private let matrix: [[String]]
private let locations: [String:(Int, Int)]
private let xBounds, yBounds: ClosedInterval<Int>

init(_ locs: [[String]]) {
self.matrix = locs
var dict: [String:(Int, Int)] = [:]
for (y, row) in locs.enumerate() {
guard row.endIndex == locs[0].endIndex else { fatalError("All rows must be equal length") }
for (x, loc) in row.enumerate() {
dict[loc] = (x, y)
}
}
self.locations = dict
self.xBounds = ClosedInterval(0, locs[0].endIndex - 1)
self.yBounds = ClosedInterval(0, locs.endIndex - 1)
}

subscript (x: Int, y: Int) -> String? {
return (xBounds ~= x && yBounds ~= y) ? matrix[y][x] : nil
}

subscript(loc: String) -> (Int, Int)? { return locations[loc] }

enum Direction: Int { case North = 0, East, South, West }

private func shift(dir: Direction, from: (Int, Int)) -> (Int, Int) {
switch dir {
case .North: return (from.0, from.1 - 1)
case .South: return (from.0, from.1 + 1)
case .East: return (from.0 + 1, from.1)
case .West: return (from.0 - 1, from.1)
}
}

func adjacentTo(from: String, dir: Direction) -> String? {
return locations[from].flatMap {
self[shift(dir, from: $0)]
}
}

func adjacentTo(from: String) -> [String] {
return (0..<4).flatMap {
adjacentTo(from, dir: Direction(rawValue: $0)!)
}
}
}

这可能有点过分了。但它几乎可以让您获得您想要的行为。使用方法如下:

// To set up, give it a matrix

let map = Map([
["Home", "Work"],
["Gym" , "Pub" ]
])

矩阵可以是任意大小,但所有行的长度必须相同。然后,继续使用它的方法:

// Find a place in a given direction
map.adjacentTo("Home", dir: .East) // "Work"

// Find all adjacents to a given place
map.adjacentTo("Pub") // ["Work", "Gym"]

或者,在更大的 map 上:

let map = Map([
["Home", "Work" , "School" ],
["Gym" , "Pub" , "Cafe" ],
["Pool", "Cinema", "Library"]
])

map.adjacentTo("Cinema", dir: .East) // "Library"

map.adjacentTo("Pub") // ["Work", "Cafe", "Cinema", "Gym"]

// Using the coordinate system
map["Home"] // (0, 0)
map[ 1, 1 ] // "Pub"

关于ios - 我知道在 Swift 的变量中使用变量是不行的……但是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31252757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com