这是一个合理的 Objective-C 块实现吗?

2023-12-06

我想要 NSRegularExpression 的变体– stringByReplacingMatchesInString:options:range:withTemplate:使用块而不是模板的方法。该块的返回值将用作替换值。正如您可以想象的那样,这比模板更灵活。有点像使用/ePerl 正则表达式中的修饰符。

所以我写了一个类别来添加方法。这就是我想出的:

@implementation NSRegularExpression (Block)

- (NSString *)stringByReplacingMatchesInString:(NSString *)string
                                       options:(NSMatchingOptions)options
                                         range:(NSRange)range
                                    usingBlock:(NSString* (^)(NSTextCheckingResult *result))block
{
    NSMutableString *ret = [NSMutableString string];
    NSUInteger pos = 0;

    for (NSTextCheckingResult *res in [self matchesInString:string options:options range:range]) {
        if (res.range.location > pos) {
            [ret appendString:[string substringWithRange:NSMakeRange(pos, res.range.location - pos)]];
        }
        pos = res.range.location + res.range.length;
        [ret appendString:block(res)];
    }
    if (string.length > pos) {
        [ret appendString:[string substringFromIndex:pos]];
    }
    return ret;
}

@end

这是我第一次尝试在 Objective C 中使用块。感觉有点奇怪,但似乎效果很好。不过,我对此有几个问题:

  1. 这看起来是实现这种方法的明智方法吗?
  2. 有什么方法可以使用它来实现其内部结构-enumerateMatchesInString:options:range:usingBlock: ?我尝试了,但无法分配给pos从块内。但如果有一种方法可以让它工作,那么传递 NSMatchingFlags 和 BOOL 并以与该方法相同的方式处理它们会很酷。可行吗?

Update

感谢 Dave DeLong 的回答,我得到了一个使用块的新版本:

@implementation NSRegularExpression (Block)

- (NSString *)stringByReplacingMatchesInString:(NSString *)string
                                       options:(NSMatchingOptions)options
                                         range:(NSRange)range
                                    usingBlock:(NSString * (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block
{
    NSMutableString *ret = [NSMutableString string];
    __block NSUInteger pos = 0;

    [self enumerateMatchesInString:string options:options range:range usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop)
    {
        if (match.range.location > pos) {
            [ret appendString:[string substringWithRange:NSMakeRange(pos, match.range.location - pos)]];
        }
        pos = match.range.location + match.range.length;
        [ret appendString:block(match, flags, stop)];
    }];
    if (string.length > pos) {
        [ret appendString:[string substringFromIndex:pos]];
    }
    return [NSString stringWithString:ret];
}

@end

效果很好,谢谢!


能够分配给pos从块内更改声明就像更改声明一样简单:

NSUInteger pos = 0;

To:

__block NSUInteger pos = 0;

更多信息关于__block关键词:__block变量

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是一个合理的 Objective-C 块实现吗? 的相关文章

  • 使用反射的属性类型或类

    我想知道是否可以确定对象属性的类或原始类型 获取所有属性名称和值非常容易 所以答案 https stackoverflow com questions 2299841 objective c introspection reflection
  • Objective-c中的贝塞尔曲线算法

    比我聪明的人可以看一下这个吗 我正在尝试实现我发现的贝塞尔曲线算法here http webtweakers com swag GRAPHICS 0074 PAS html在 Objective c 中 输出是错误的 我想我正确地转换了代码
  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • 获取 Cocoa 中文件的类型

    我成功找到了指定文件的扩展文件类型 JPEG 图像 TIFF 图像等 但我正在寻找更通用的东西 可以对 大类别 中的文件进行分类 如图像 moovies 文本文件等 有没有办法在可可 或 Objective C 中实现这一点 感谢您的帮助
  • 推送/呈现模态视图控制器

    我的视图控制器中有一个表 我们称之为 TVC1 我使用了 TVC1 中的行 以便用户除了 TVC1 上的数据之外还可以输入更多数据 因此 当有人点击 TVC1 中的特定行时 它将显示另一个视图控制器 我们称之为 TVC2 然而 当显示TVC
  • 我无法捕获 WKWebView 的屏幕截图

    我正在尝试捕获 WKWebView 的屏幕截图 但我的方法无法正常工作 它返回纯色 就好像图层树为空一样 而它似乎适用于其他视图 UIImage screenshot UIImage screenshot UIGraphicsBeginIm
  • 以编程方式更改 UISlider 的范围

    如何以编程方式设置 UISlider 的最小最大范围 例如 虚拟代码 UISlider slider UISlider alloc init slider min 3 slider max 3 EDIT 所以我有以下内容 sl minimu
  • 在 Objective-C 中获取对象的属性数组

    Objective C 中是否可以获取对象所有属性的数组 基本上 我想做的是这样的 void save NSArray propertyArray self propertyNames for NSString propertyName i
  • 防止 UITableView 滚动到某个点以下

    如何让 UITableView 允许在某个索引行上方滚动 但在低于某个点时阻止滚动 例如 如果我有第 1 行到第 100 行 其中在给定时间视图中仅出现 5 行 我希望允许用户在第 1 50 行之间滚动 但在第 50 行可见时阻止进一步向下
  • OpenGL ES 1.1 顶点缓冲区对象不工作

    我正在使用 OpenGL ES 1 1 开发一款 iPhone 游戏 需要使用顶点缓冲区对象来渲染 500 多个粒子而不降低性能 我的游戏能够使用非 VBO 方法成功绘制 但现在我尝试合并 VBO 却不再绘制任何内容 请帮助我找出我做错了什
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • 后台模式下的 AVSpeechSynthesizer

    我无法获取 iOS 7AVSpeechSynthesizer当我的 iOS 应用程序处于后台模式时工作 我添加了 应用程序播放音频 应用程序支持的后台模式的关键 但我仍然无法让它工作 我还研究了创建一个AVMutableCompositio
  • 如何在 iOS 5 中使用 Embed Segue?

    iOS 6 引入了 Embed Segue 允许在 Storyboard 中使用自定义容器控制器 有没有办法在 iOS 5 上复制这个 这里的挑战是子视图控制器的视图通常要添加为父视图控制器的某些容器视图的子视图 因为你不能随机进行序列UI
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d
  • Draggable UIView 在添加到 UIScrollView 后停止发布 TouchBegan

    在 Xcode 5 1 中我创建了一个简单的测试应用程序 https github com afarber ios newbie tree master ScrollContent对于 iPhone 结构是 scrollView gt co
  • 如何使用苹果钥匙串?

    我正在尝试使用scifihifi iphone 来自 Github http github com ldandersen scifihifi iphone tree master security存储和检索用户名和密码 但是 当我添加课程时
  • 块与代表[重复]

    这个问题在这里已经有答案了 可能的重复 代码块能完全取代委托吗 https stackoverflow com questions 4584404 do code blocks completely replace delegates 我刚
  • cocos2d中获取CCSprite的绝对位置

    在我的游戏中 我有一个CCSprite绕另一个轨道运行CCSprite 很像电子绕原子核运行 我将电子作为原子核的子元素 以使动画更加简单 我所要做的就是旋转原子核 电子就会很好地跟随 然而 我的问题来自于想要让轨道动画看起来更时髦一点 通
  • 是否可以使用 UITableViewStylePlain 禁用 UITableView 中的浮动标题?

    我正在使用一个UITableView布局内容 页面 我使用表视图的标题来布局某些图像等 如果它们不浮动而是保持静态 就像样式设置为时那样 我更喜欢它UITableViewStyleGrouped 其他则使用UITableViewStyleG
  • Objective C“#if”语法

    我对 如果 或 如果 有点困惑 if当我查看一些类时我看到的语法 例如 if someConstant someNumber do something elif etc versus if someConstant someNumber d

随机推荐

  • 如何在 ul 下拉菜单中显示选定的菜单项

    我有一个下拉菜单 显示字体颜色供用户选择 目前 下拉列表显示 样式 但是我希望菜单标题显示当前选择的值 这是代码 HTML div class dropdown div
  • Objective-C 中的 HTTP Post 请求不起作用

    我正在编写一个 HTTP Post 请求 但由于某种原因 参数没有正确添加 而且我一生都无法弄清楚我做错了什么 这是我所拥有的 NSMutableURLRequest request NSMutableURLRequest alloc in
  • VBA - 从关闭的 Excel 工作簿中检索数据

    我正在尝试创建一个 VBA 脚本来从四个不同的工作簿收集数据 目前 我只是使用一本工作簿测试代码 但当我尝试获取数据时收到错误 虽然我想在不打开四个工作簿的情况下检索数据 但我需要打开它们才能找到最后一行数据 这是我当前的代码 Public
  • SilverStripe 4.1 - SS_DEFAULT_ADMIN_USERNAME 和 PASSWORD 不受尊重

    我有一个在 Ubuntu Vagrant VM 上运行的 SilverStripe 4 1 站点 从 3 4 升级 我有以下内容 env file Default Admin SS DEFAULT ADMIN USERNAME admin
  • 如何从 STDIN 将行导入到 Postgresql? [复制]

    这个问题在这里已经有答案了 在 Python 中 我有以下命令可以将行批量加载到 Postgresql 而不使用文件 import csv import subprocess mylist keys name fred name mary
  • video-js 自定义字体在 Firefox 中不起作用

    使用 Firefox 查看这里 我有 22 0 http www jamhouse com au 您会看到 video js 自定义字体不起作用 在 Chrome 中运行良好 任何想法将不胜感激 Watto Firefox 有极其严格的跨域
  • 如何在Java中获取.(点)之前和/(最后一个)斜杠之后的字符串

    我有一个像这样的字符串 core pages viewemployee jsff 从这段代码中 我需要获取 viewemployee 我如何使用 Java 获得这个 假设您将该字符串保存在名为的变量中myString String mySt
  • 如何在C++中添加2个任意大小的整数?

    我想在 C 中添加 2 个任意大小的整数 我该怎么做呢 Here s an example showing how to use the OpenSSL bignum implementation for arbitrary precisi
  • 无法将类型“十进制”隐式转换为“字符串”

    我正在创建的购物车中有此代码 但我收到标题中显示的错误 错误显示在这一行上 只需致电ToString获取十进制值的字符串表示形式 order Total orderTotal ToString G 虽然我不明白你为什么要存储会员Total
  • 单个引用变量如何访问所有对象字段?

    Animal myAnimal new Animal 我上面有这段代码 据我所知 它会做这些事情 将在堆内存上创建一个动物对象 对该对象的引用将传递给引用变量 myAnimal 换句话说 myAnimal 变量保存 Animal 对象在堆上
  • 如何在OpenCV2 python中查看视频流

    我开始玩Opencv 我在 Linux 上使用 opencv2 的 python 绑定 我编写了一个快速测试程序 但它似乎无限期地挂起 import cv2 weblink http continuous video stream here
  • Django框架中的一次性操作操作应该放在哪里?

    我想执行一些一次性操作 例如在 Django 服务器启动时启动后台线程并每 30 分钟填充一次缓存作为初始化操作 这样它就不会阻止用户访问网站 我应该将所有这些代码放在 Django 中的哪里 将它们放入setting py文件中不起作用
  • 使用(Anaconda 与 PyCharm

    我的 Linux Ubuntu 14 04 机器上运行着 Pycharm 4 除了系统 python 之外 我还安装了 Anaconda 让两者很好地协同工作似乎有点问题 PyCharm 提供了一些有趣的集成virtualenvs and
  • 是否可以更改 Python 中函数的默认参数?

    在Python中 是否可以在运行时重新定义函数的默认参数 我在这里定义了一个有3个参数的函数 def multiplyNumbers x y z return x y z print multiplyNumbers x 2 y 3 z 3
  • 在for循环中写入多个文件

    我有这样的样本数据 df lt data frame name rep letters 1 7 each 24 salary runif 24 7 100 200 我想将每个名字与他们的薪水分开 lst lt tapply df salar
  • 在Java中获取系统音频级别

    如何获得 Java 中的主卷 我想制作一个显示 不变 这个值 可能在JProgressBar或类似的东西 作为最大设置的百分比 我可能还想将当前声级显示为最高可能声级的百分比 但这不是必需的 我不完全确定 但你可以看看 Java 媒体框架
  • pytorch 等效 tf.gather

    我在将一些代码从tensorflow移植到pytorch时遇到一些问题 所以我有一个尺寸为 10x30 的矩阵 代表 10 个示例 每个示例有 30 个特征 然后我有另一个维度为 10x5 的矩阵 其中包含第一个矩阵中每个示例的 5 个最接
  • Mex 文件在 OS X 10.9 下使用 Xcode 5.1 和 MATLAB 2012a

    我正在尝试编译 OpenCV 3 0 0 的开发人员版本 但是我无法将我的系统配置为 mex C 文件 我尝试遵循 stackoverflow 的建议 目前我可以合并 c 文件 但不能合并 C 文件 我所做的是编辑mexopts sh这样就
  • 如何使用 REST API 在 Jira 中创建问题?

    如何使用 REST API 在 Jira 中创建问题 我已经尝试过使用curl 的示例 但我需要使用 Java 和 REST API 在 Eclipse 中创建缺陷 您想将 JIRA 集成到 Eclipse 中吗 See https con
  • 这是一个合理的 Objective-C 块实现吗?

    我想要 NSRegularExpression 的变体 stringByReplacingMatchesInString options range withTemplate 使用块而不是模板的方法 该块的返回值将用作替换值 正如您可以想象