天道酬勤,学无止境

Reading a Variable that Exists in a Delegate Function

问题

我有一个委托,它修改了一个名为tagToIndex的变量,我试图从委托中返回修改后的变量。 tagToIndex在类的前面定义,但它不包含我需要的信息。

我的问题是,有没有办法读取变量tagToIndex ,因为它存在于willPressItemAt函数中? 截至目前,我无法在函数之外读取变量。

显然我不能在willPressItemAt上使用return命令,因为这需要我输入我不能做的参数。 此外,我尝试使用委托,但并没有真正解决问题。

class MyCell: UITableViewCell, YSSegmentedControlDelegate {

var tagToIndex = [0:0,1:0,2:0,3:0,4:0,5:0]

let actionButton = YSSegmentedControl(
    frame: CGRect.zero,
    titles: [
        "Yes",
        "No"
    ])      
}    

func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) {
    tagToIndex[actionButton.tag] = index
    print(tagToIndex)

}

func segmentedControl(_ segmentedControl: YSSegmentedControl, didPressItemAt index: Int) {

}

}
上面是委托函数,其中存在我想要的tagToIndex版本。 我希望能够访问tagToIndex类中的 tagToIndex

另一种可能性是在函数外部简单地修改 tagToIndex ,但我需要index ,这是一个只存在于函数中的值。 当我在viewDidLoad中执行print(index)时,它返回的只是(function)

谢谢,尼克

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Reading a Variable that Exists in a Delegate Function
    I have a delegate that modifies a variable called tagToIndex, and I am trying to return the modified variable from the delegate. tagToIndex is defined earlier on in the class, but it does not contain the information I need. My question is, is there any way to read the variable tagToIndex as it exists within the willPressItemAt function? As of right now, I have no way of reading the variable outside of the function. Obviously I cannot use the return command on willPressItemAt, because that would require I feed in parameters which I cannot do. Additionally, I tried to use delegates but it didn't
  • How to show progress of reading from a file and writing to a database
    问题 我有以下从按钮单击调用的函数。 该函数读取文件,然后尝试写入 SQL 表: public void saveCSV() { lblCSVStatus.Text = ""; worker = new BackgroundWorker { WorkerReportsProgress = true }; worker.DoWork += (sender, args) => { tbTable.Invoke((MethodInvoker)delegate { tbTable.Enabled = false; }); myConnection = new SqlConnection(cString); myConnection.Open(); /* BEGIN READING CSV FILE */ StreamReader sr = new StreamReader(tbCSVFileLocation.Text.ToString()); string line = sr.ReadLine(); string[] value = line.Split(','); DataTable dt = new DataTable(); DataRow row; foreach (string dc in value) { dt.Columns.Add(new DataColumn(dc)); }
  • How to show progress of reading from a file and writing to a database
    I have the following function which is called from a button click. The function reads the file and then attempts to write to a SQL table: public void saveCSV() { lblCSVStatus.Text = ""; worker = new BackgroundWorker { WorkerReportsProgress = true }; worker.DoWork += (sender, args) => { tbTable.Invoke((MethodInvoker)delegate { tbTable.Enabled = false; }); myConnection = new SqlConnection(cString); myConnection.Open(); /* BEGIN READING CSV FILE */ StreamReader sr = new StreamReader(tbCSVFileLocation.Text.ToString()); string line = sr.ReadLine(); string[] value = line.Split(','); DataTable dt =
  • 一个 lambda 表达式如何共享一个局部变量?(How does a lambda expression shares a local variable?)
    问题 我正在阅读有关 lambda 表达式的信息,并且已经看过这个示例, 示例 1: static Func<int> Natural() { int seed = 0; return () => seed++; // Returns a closure } static void Main() { Func<int> natural = Natural(); Console.WriteLine (natural()); // output : 0 Console.WriteLine (natural()); // output : 1 } 示例 2: static Func<int> Natural() { return() => { int seed = 0; return seed++; }; } static void Main() { Func<int> natural = Natural(); Console.WriteLine (natural()); // output : 0 Console.WriteLine (natural()); // output : 0 } 我无法理解为什么第一个示例输出是 0 和 1。 回答1 lambda 表达式可以引用定义它的方法的局部变量和参数(外部变量) 由 lambda 表达式引用的外部变量称为捕获变量。 捕获变量的
  • 如何检查是否定义了 angularjs 控制器(How to check if an angularjs controller has been defined)
    问题 我有一个这样定义的应用程序: angular.module("myApp", [...]) .config(function ($stateProvider, $controllerProvider) { if (isControllerDefined(controllerName)) { do_stuff(); } }) 控制器是这样定义的: angular.module("myApp") .controller("myController", function ($scope) { ... }); 如果我有控制器的名称,我如何定义isControllerDefined() (在上面的配置中)来检查给定的控制器是否存在? 我觉得我应该能够做这样的事情之一: var ctrl = angular.module("myApp").getController("myController"); var ctrl = $controllerProvider.get("myController"); 或类似的东西......但我找不到任何功能。 帮助? 回答1 可以检查控制器是否存在的服务示例。 请注意,它查找具有指定名称的全局函数以及$controller提供程序中的$controller 。 angular.service('ControllerChecker', ['
  • Gradle学习笔记2————Groovy基础语法
    Gradle学习笔记2————Groovy基础语法 文章目录 Gradle学习笔记2————Groovy基础语法一.Groovy简介1.Groovy简介2.Groovy环境 二.Groovy和Java的差异1.默认导入部分包2. 方法重载3.初始化数组4.变量作用域5.Lambda 表达式和方法引用操作符6.String7.基本变量8.额外关键字9. 其他细节差异 三.Groovy基础语法1.和java相似点2.变量3.String4.数据结构 四.Groovy闭包1.闭包的基本语法2.this / owner / delegate3.授权策略 五.Groovy面向对象1.基础概念2.Groovy中的变量和作用域3.元编程(groovy运行时方法调用) 六.Groovy文件操作1.文件操作2.操作Json3.操作xml 七.参考资料 一.Groovy简介 1.Groovy简介 Groovy 是一种与 Java 语法兼容的 Java 平台面向对象程序设计语言。它既是一种静态语言,也是一种动态语言,具有与 Python、 Ruby 和 Smalltalk 类似的特性。它既可以作为 Java 平台的编程语言,也可以作为 Java 平台的脚本语言,被编译成 Java 虚拟机字节码,并且可以与其他 Java 代码和库无缝地互操作。 但相比Java语言,他支持动态类型,闭包等高级特性
  • 委托中变量的范围(Scope of variables in a delegate)
    问题 我发现以下内容很奇怪。 再说一次,我主要使用动态语言中的闭包,这不应该被怀疑为相同的“错误”。 以下使编译器不满意: VoidFunction t = delegate { int i = 0; }; int i = 1; 它说: 不能在此范围内声明名为“i”的局部变量,因为它会给“i”赋予不同的含义,而“i”已在“子”范围中用于表示其他内容 所以这基本上意味着在委托中声明的变量将具有声明在其中的函数的范围。这与我所期望的不完全相同。 我什至没有尝试调用该函数。 至少 Common Lisp 有一个特性,如果你真的希望它是本地的,你可以说一个变量应该有一个动态名称。 这在创建不会泄漏的宏时尤为重要,但类似的东西在这里也会有帮助。 所以我想知道其他人如何解决这个问题? 为了澄清,我正在寻找一种解决方案,其中我在委托中声明的变量不会干扰委托之后声明的变量。 而且我希望仍然能够捕获在委托之前声明的变量。 回答1 必须以这种方式允许匿名方法(和 lambda 表达式)使用包含方法范围内的局部变量和参数。 解决方法是为变量使用不同的名称,或者创建一个普通的方法。 回答2 匿名函数创建的“闭包”与其他动态语言创建的“闭包”有些不同(我将使用 Javascript 作为示例)。 function thing() { var o1 = {n:1} var o2 = {dummy:"Hello
  • 退订活动(Unsubscribing from an event)
    问题
  • 使用/不使用委托()启动线程(Starting a thread with / without delegate())
    问题 有什么区别: new Thread(new ThreadStart(SomeFunc)) 和: new Thread( delegate() { SomeFunc();} ) 这段代码在我的电脑上给出了奇怪的输出: public class A { int Num; public A(int num) { Num = num; } public void DoObj(object obj) { Console.Write(Num); } public void Do() { Console.Write(Num); } } /////// in void main() for (int i = 0; i < 10; i++) { (new Thread(new ThreadStart((new A(i)).Do))).Start(); // Line 1 (new Thread(new ThreadStart(delegate() { (new A(i)).Do(); }))).Start(); // Line 2 (new Thread(delegate() { (new A(i)).Do(); })).Start(); // Line 3 } 如果只执行第 1 行,则输出类似于: 0 2 3 1 5 6 4 7 8 9 没关系,但如果执行第 2 行或第 3 行,输出为: 3
  • iOS中从右到左的NavigationController(NavigationController Right to Left in iOS)
    问题 我正在构建一个从右到左的导航控制器来支持 RTL 语言。 在阅读 StackOverFlow 中的一些帖子后,使用 UINavigationController 从右到左推送 ViewController,我认为这种方法最合适: DetailedViewController *DVC = [[DetailedViewController alloc]initWithNibName:@"DetailedViewController" bundle:nil]; NSMutableArray *vcs = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; [vcs insertObject:DVC atIndex:[vcs count]-1]; [self.navigationController setViewControllers:vcs animated:NO]; [self.navigationController popViewControllerAnimated:YES]; 这将创建一个详细的视图控制器并将其添加到 NavigationController 正下方的视图控制器堆栈中。 当弹出 NavigationController 时
  • 在文档目录中下载或异步移动文件 - iOS(Download in documents directory or move file async - iOS)
    问题 我正在构建一个 iOS 应用程序,用户可以在其中下载不同的文件。 我正在使用URLSessionDownloadTask和URLSession异步下载文件。 下载完成后,目标文件夹默认为tmp/目录。 因此,当下载结束时,我需要将临时文件移动到另一个目录。 对于一张图片或一首歌,这只需 1 秒,甚至更短。 但是,例如,当文件是视频时,最多可能需要 15 秒。 问题 为了允许用户仍然与应用程序交互,我想让这个动作异步。 每次我尝试这样做时,文件管理器都会抛出异常。 “CFNetworkDownload_xxxxxx.tmp”无法移动到“下载”,因为前者不存在,或者包含后者的文件夹不存在。 我试过什么 我试图把对文件管理器的调用放在后台线程中,它抛出了。 我尝试在调用 move 方法之前删除目标文件,以确保该文件不存在。 在从tmp/目录中删除文件之前,我尝试调用copy函数。 我的代码 对文件管理器的调用看起来像这样。 func simpleMove(from location: URL, to dest: URL) -> Bool { let fileManager = FileManager.default do { try fileManager.moveItem(at: location, to: dest) return true } catch { print("\
  • 如何在 vb.net 中的字符串数组中查找和计算重复数字?(how to Find and count duplicate numbers in a string array in vb.net?)
    问题 如何计算vb.net中字符串或整数数组中存在的重复数字? Dim a as string = "3,2,3" 从上面的“a”变量中,我想要将“3”计数为 2(我的意思是 3 存在 2 次),将“2”计数为“1”。 那么我如何在 vb.net 中制作它???? 实际上我会从 sql 数据库中得到上面的字符串“a”。 所以我不知道那里有哪些数字。 这就是我在这里问的原因。 回答1 您已经有一些不错的答案可供选择,但我认为您会对单衬解决方案感兴趣。 Module Module1 Sub Main() Dim str() As String = "1,2,1,2,3,1,0,1,4".Split(","c) str.Distinct().ToList().ForEach(Sub(digit) Console.WriteLine("{0} exists {1}", digit, str.Count(Function(s) s = digit))) Console.ReadLine() End Sub End Module 关于正在发生的事情的解释: str. Distinct() - 返回数组中所有唯一项的IEnumerable对象. ToList() - 将IEnumerable对象转换为List<T> . ForEach() - 遍历List<T> Sub(digit) -
  • 了解 Lambda 表达式和委托 [关闭](Understanding Lambda expressions and delegates [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 6年前关闭。 改进这个问题 我一直试图解决这个问题(阅读在线博客和文章),但到目前为止没有成功。 什么是代表? 什么是 Lambda 表达式? 两者的优缺点? 何时使用一种或另一种可能的最佳实践? 提前致谢。 回答1 委托是可以用作变量的方法,例如字符串等。例如,您可以使用一个参数声明委托方法: delegate void OneArgumentDelegate(string argument); 它什么都不做,很像一个接口。 如果您在任何类中有一个方法,并且有一个像这样的参数: void SomeMethod(string someArgument) {} 它委托的签名,因此可以分配给其类型的变量: OneArgumentDelegate ThisIsAVariable = new OneArgumentDelegate(SomeMethod); OneArgumentDelegate ThisIsAlsoAVariable = SomeMethod; // Shorthand works too 然后可以将它们作为参数传递给方法并调用,如下所示: void Main() { DoStuff(PrintString); } void
  • C#中的ref和out参数,不能标记为变体(ref and out parameters in C# and cannot be marked as variant)
    问题 该声明是什么意思? 从这里 C#中的ref和out参数,不能将其标记为变量。 1)是否表示无法完成以下操作。 public class SomeClass<R, A>: IVariant<R, A> { public virtual R DoSomething( ref A args ) { return null; } } 2)或这意味着我不能满足以下条件。 public delegate R Reader<out R, in A>(A arg, string s); public static void AssignReadFromPeonMethodToDelegate(ref Reader<object, Peon> pReader) { pReader = ReadFromPeon; } static object ReadFromPeon(Peon p, string propertyName) { return p.GetType().GetField(propertyName).GetValue(p); } static Reader<object, Peon> pReader; static void Main(string[] args) { AssignReadFromPeonMethodToDelegate(ref pReader)
  • 有人可以解释这个 C# lambda 语法吗?(Can someone explain this C# lambda syntax?)
    问题 我最近遇到了一个声明为的静态方法: public class Foo { public static Func<HtmlHelper, PropertyViewModel, string> Render = (a, b) => { a.RenderPartial(b); return ""; }; } Intellisense 建议的用法是(例如): string s = Foo.Render(htmlHelper, propertyViewModel); 那么似乎以下内容是等效的: public static string Render(HtmlHelper a, PropertyViewModel b) { a.RenderPartial(b); return ""; } A) 第一种样式的名称是什么? 我意识到它正在使用 lambdas; =符号让我绊倒了。 我无法标记它;) B) 如果两个代码块是等价的,使用前者比使用后者有什么好处? 回答1 在大多数情况下,它们看起来在功能上是等效的。 事实上,您可以将普通方法作为变量传递。 但是有一些细微的区别,比如能够将函数重新定义为其他东西。 如果您使用反射,它可能也有所不同,例如它可能不会在类的方法列表中返回。 (对反射部分不是 100% 确定) 下面显示了将方法作为变量传递,以及第二种方法如何允许重新定义 Func
  • 传递给委托时作为参考类型处理的整数(Integer handled as reference type when passed into a delegate)
    问题 我本周参加了在荷兰举行的TechDays 2013,并提出了一个有趣的测验问题。 问题是:以下程序的输出是什么。 代码如下所示。 class Program { delegate void Writer(); static void Main(string[] args) { var writers = new List<Writer>(); for (int i = 0; i < 10; i++) { writers.Add(delegate { Console.WriteLine(i); }); } foreach (Writer writer in writers) { writer(); } } } 显然,我给出的答案是错误的。 我争论了一下,因为int是一个值类型,所以传递到Console.WriteLine()的实际值将被复制,因此输出将为0 ... 9。 但是,在这种情况下, i将作为参考类型处理。 正确的答案是它将显示十次。10.谁能解释原因和方式? 回答1 我争论了一下,因为int是一个值类型,所以传递到Console.WriteLine()的实际值将被复制 那是完全正确的。 当您调用WriteLine该值将被复制。 那么,您什么时候致电WriteLine ? 它不在for循环中。 您当时并没有编写任何内容,只是创建了一个委托。 直到调用委托时
  • c++ 写二进制文件追加_C语言文件操作大全
    前言:这篇文章主要介绍了C语言文件操作大全的相关资料。正文:1、文件分为ASCII文件和二进制文件,ASCII文件也称文本文件,由一系列字符组成,文件中存储的是每个字符的ASCII码值。2、FILE *fp;FILE是文件类型标识符,是C编译系统定义好的一个结构体类型,结构体中含有文件名、文件状态等信息。 其定义一个指针变量fp,该变量用于指向一个文件,存放的是文件缓冲区的首地址。3、文件的打开:fopen();C语言访问文件的方式一共有12种。由这几个关键字组合而成:read,write,append(追加),text(文本文件),banary(二进制文件),+表示读和写。4、文件的关闭:fclose();操作系统对打开的文件数量有限制,当打开的文件过多的时候,文件之间的读写会相互影响,所以要及时关闭不使用的文件。 该函数正常关闭文件时返回0,否则-1;需要学习的关注我关闭文件的时候,系统对fp所指向的缓冲区进行清理,把数据输出到磁盘文件,然后释放缓冲区单元,使文件指针与具体文件脱钩。这样防止文件丢失、信息被破坏。但是用C语言操作文件的时候,有时会产生乱码,这个时候要检查一下自己的程序,写入文件的变量有没有初始化,有没有正确关闭文件。当变量没有初始化的时候,乱码经常表现为“烫烫烫”。还有一种可能就是文件编码方式与程序的编码方式不一致
  • AVCaptureDeviceOutput 不调用委托方法 captureOutput(AVCaptureDeviceOutput not calling delegate method captureOutput)
    问题 我正在构建一个 iOS 应用程序(我的第一个),可以动态处理视频静止帧。 为了深入探讨这一点,我参考了 Apple 的 AV* 文档中的一个示例。 该过程涉及设置输入(相机)和输出。 输出与委托一起工作,在这种情况下是控制器本身(它符合并实现所需的方法)。 我遇到的问题是委托方法永远不会被调用。 下面的代码是控制器的实现,它有几个 NSLog。 我可以看到“开始”消息,但“调用的委托方法”从未显示。 此代码全部位于实现“AVCaptureVideoDataOutputSampleBufferDelegate”协议的控制器中。 - (void)viewDidLoad { [super viewDidLoad]; // Initialize AV session AVCaptureSession *session = [AVCaptureSession new]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) [session setSessionPreset:AVCaptureSessionPreset640x480]; else [session setSessionPreset:AVCaptureSessionPresetPhoto]; //
  • 为什么在 C# 中局部变量不能是 volatile?(why can't a local variable be volatile in C#?)
    问题 public void MyTest() { bool eventFinished = false; myEventRaiser.OnEvent += delegate { doStuff(); eventFinished = true; }; myEventRaiser.RaiseEventInSeperateThread() while(!eventFinished) Thread.Sleep(1); Assert.That(stuff); } 为什么 eventFinished 不能是 volatile 并且重要吗? 在我看来,在这种情况下,编译器或运行时可能会变得很聪明,并且在 while 循环中“知道” eventFinished 只能是 false。 尤其是当您考虑将提升的变量生成为类的成员并将委托生成为同一类的方法时,从而剥夺了 eventFinished 曾经是局部变量这一事实的优化。 回答1 存在一个线程原语 ManualResetEvent 来精确完成此任务 - 您不想使用布尔标志。 这样的事情应该可以完成这项工作: public void MyTest() { var doneEvent = new ManualResetEvent(false); myEventRaiser.OnEvent += delegate { doStuff()
  • eval不读取内部函数内的变量(eval not reading variable inside a internal function)
    问题 当使用内部函数时,它读取外部函数中定义的变量。 但是在使用 eval() 时它以某种方式失败了。 这似乎与 locals() 的工作方式有关......但我不确定如何以及为什么...... def main(): aaa = 'print this' def somethingelse(): print(locals()) #print(aaa) print(eval('aaa')) print(locals()) somethingelse() main() 上面的代码不起作用,给出错误消息:File "", line 1, in NameError: name 'aaa' is not defined 但是如果取消标记 print(aaa) 以便两个打印行都存在,那么它们都将起作用。 我尝试在此 print(aaa) 命令之前和之后打印 locals(),结果是如果标记了 print(aaa) 行,则 locals() 将为空 {}。 但是如果没有标记,那么 locals() 都会是 {aaa: 'print this'} 这对我来说很困惑...... 回答1 当你的 Python 代码被编译时,编译器必须做一些特殊的事情来允许从嵌套函数内部访问局部变量。 这使得对变量的所有访问都变慢,因此它只对它知道在内部函数中使用的变量执行此操作。