【问题标题】:Best way to implement pointer in Swift [closed]在 Swift 中实现指针的最佳方法 [关闭]
【发布时间】:2016-06-08 15:09:56
【问题描述】:

在 Objective-C 中,使用布尔指针来停止枚举是很常见的,例如:

[myArray rh_iterate:^(id element, int index, BOOL *stop){
    // Do cool stuff
    *stop = YES;
}];

我已经这样实现了:

// This is in a category of NSArray
- (void)rh_iterate:(void (^)(id, int, BOOL *))block
{
    if (!block) { return; }

    BOOL stop = NO;
    for (int i = 0; i < self.count; i++) {
        block(self[i], i, &stop);
        if (stop) { return; } 
    }
}

我现在正在 Swift 中实现我的版本,但不依赖任何 Objective-C 源代码。我知道 swift 喜欢限制指针的访问,那么实现这一点的最佳方法是什么? (理想情况下完全避免使用指针。)

编辑:

最直接的方法是:

func rh_iterate(callback: (Element, Int, UnsafeMutablePointer<Bool>) -> ()) {

        var stop: Bool = false
        for (index, element) in self.enumerate() {
            callback(element, index, &stop)
            if stop { return }
        }
    }

【问题讨论】:

  • 您到底想达到什么目的?最直接的等价物是inout 参数。如果我要坚持这条“路线”,你会走下去,我只会让闭包返回bool。但如果你告诉我更多的背景,我相信我们可以想出一个更好的解决方案。
  • 我从一种语言翻译成另一种语言的技巧是……忘记语言。阅读原文用简单的英语句子,例如“好的,它需要这个东西,然后它循环这个并删除那个,然后它......”。一旦你把这个过程变成句子,用新语言重新实现它比进行真正的翻译要容易得多。
  • @EricD 图像汇编程序员进入 Swift 询问如何在寄存器 1 上 bne
  • 没错。除非您只是出于好奇,否则您不一定要使用与 Objective-C 相同的逻辑在 Swift 中解决问题。告诉我们问题所在,我们会为您提供帮助。
  • 基于意见?垃圾。正如我的回答所证明的那样,有一个直接等效的模式。

标签: objective-c swift pointers


【解决方案1】:

既然AMomchilov删了他的回答,那我就放回去了。

直接等效于BOOL* 模式将是一个 inout 变量

extension Array
{
    func iterateWithStop(closure: (Element, inout shouldStop: Bool) -> ()) -> Bool
    {
        var shouldStop = false
        for e in self
        {
            guard !shouldStop else { return false }
            closure(e, shouldStop: &shouldStop)
        }
        return !shouldStop
    }
}

如果迭代完成而没有闭包尝试停止,则该函数返回 true,如果闭包确实尝试停止它,则返回 false。

你会这样使用它:

let myArray = [1, 2, 3,  -1, 4]

var sum = 0
let didProcessAllElements = myArray.iterateWithStop{ e, shouldStop in
    if e < 0 
    {
        shouldStop = true
    }
    else
    {
        sum += e
    }
}

// sum == 6

(在 Swift 2.2 的操场上测试)

【讨论】:

  • 我刚刚为此创建了一个小XCTest,效果很好。
  • 通过一些工作,你可以把它变成SequenceType上的一个扩展,然后它就可以在任何序列上使用了。
猜你喜欢
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
相关资源
最近更新 更多