GVKun编程网logo

Swift String 罕见崩溃(swift string nsstring)

2

本篇文章给大家谈谈SwiftString罕见崩溃,以及swiftstringnsstring的知识点,同时本文还将给你拓展'string'类型的参数不能分配给'`${string}`类型的参数|`${

本篇文章给大家谈谈Swift String 罕见崩溃,以及swift string nsstring的知识点,同时本文还将给你拓展'string' 类型的参数不能分配给 '`${string}` 类型的参数 | `${string}.${string}` | `${string}.${number}`'、C# @string $string $@string、c# String ,String[] 和 List之间的转换、c# – string.Equals(“string”)和“String”.Equals(string)有什么区别?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Swift String 罕见崩溃(swift string nsstring)

Swift String 罕见崩溃(swift string nsstring)

如何解决Swift String 罕见崩溃

在我的应用程序中,我有一个记录器,可将错误和状态消息写入字符串。它没有写入文件,它只是在没有附加调试会话的情况下发生错误时方便查看。

addLog() 方法大约被调用。每 3 秒 0-10 次,相当简单:

  • 每次调用都会将新添加的内容添加到字符串的开头以及它发生的第二个
  • 为了防止字符串在大小上爆炸,如果超过2kb,它会连续切割“最旧”的100个日志字符,直到再次小于2kb

代码如下:

var logString = ""

func addLog(s : String){
    let date = Date()
    
    logString =  "\\(date.second)\\(s).\\n\\(logString)"
    
    while(logString.count>2000){
        logString=String(logString.dropLast(100))
    }
}

直到今天我收到崩溃日志时,我才发现它有任何问题:

Thread 5 name:
Thread 5 Crashed:
0   libsystem_kernel.dylib          0x00000001c00f5414 __pthread_kill + 8
1   libsystem_pthread.dylib         0x00000001ddc50b50 pthread_kill + 272 (pthread.c:1392)
2   libsystem_c.dylib               0x000000019b5d3b74 abort + 104 (abort.c:110)
3   libsystem_malloc.dylib          0x00000001a1faf49c malloc_vreport + 560 (malloc_printf.c:183)
4   libsystem_malloc.dylib          0x00000001a1faf740 malloc_zone_error + 104 (malloc_printf.c:219)
5   libsystem_malloc.dylib          0x00000001a1f99ed8 free_small_botch + 40 (magazine_small.c:2215)
6   libswiftCore.dylib              0x00000001961103d8 _swift_release_dealloc + 40 (HeapObject.cpp:648)
7   APPNAME                         0x00000001046b56a0 AppDelegate.addLog(s:) + 960 (AppDelegate.swift:0)

日志本身的奇怪之处在于 addLog() 函数不在我的 AppDelegate 的第 0 行,但也许崩溃报告中有错误的行是正常的。

对于这个问题,我能想出的唯一可能解释是我的函数中存在线程安全问题,或者我错过了有关 swift 垃圾收集的某些内容。很可能同时从不同的线程调用该函数,这可能是一个问题吗?或者我是否必须再次进入 Objective-c 时间 retain 等来解决这个问题?我可以从这个崩溃日志中得到什么?

解决方法

您必须处理串行队列中的所有更改。简单的修改:

private let queue = DispatchQueue(label: "addlog.queue")
private var logString = ""

func addLog(s : String) {
    queue.async { [weak self] in
        guard let self = self else { return }

        let date = Date()
        self.logString = String("\\(date.second)\\(s).\\n\\(self.logString)".prefix(2000))
    }
}

在您的情况下,您可以从不同的线程读取和写入“logString”参数,使用串行 DispatchQueue 处理所有带有参数的操作,使某一时刻无法读取和写入参数

'string' 类型的参数不能分配给 '`${string}` 类型的参数 | `${string}.${string}` | `${string}.${number}`'

'string' 类型的参数不能分配给 '`${string}` 类型的参数 | `${string}.${string}` | `${string}.${number}`'

如何解决''string'' 类型的参数不能分配给 ''`${string}` 类型的参数 | `${string}.${string}` | `${string}.${number}`''

我已将 react-hook-forms 从 v.6 迁移到 v.7。

更改register方法后,如migration guide中指出的,出现如下错误:

''string'' 类型的参数不能分配给 ''${string} 类型的参数 | ${string}.${string} | ${string}.${number}''。 TS2345

注册需要一个字符串名称,我正确地提供了一个参数,它肯定是一个字符串,但无论如何它不接受我的参数,如果我不完全传递字符串。

非常感谢有类似问题或任何想法的任何人。提前致谢!

解决方法

react-hook-form v7 中的

register() 不接受字符串,但字符串 literal。这是 register 的定义:

export declare type UseFormRegister<TFieldValues extends FieldValues> = <
  TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
>(
  name: TFieldName,options?: RegisterOptions<TFieldValues,TFieldName>
) => RefCallbackHandler;

TFieldName 是文字的联合。文字是特定的字段名称值。请参见下面的示例:

interface IFormValues {
  firstName: string;
  lastName: string;
}
const { register,handleSubmit } = useForm<IFormValues>();
const firstNameId = ''firstName''; // string literal
const lastNameId: string = ''lastName''; // string

return (
  <form onSubmit={handleSubmit(onSubmit)}>
    // this works because first argument is ''firstName'' | ''lastName''
    <input {...register(firstNameId)} />
    // this does not work because it''s just a string instead of one of the
    // two literal values
    <input {...register(lastNameId)} />
    <input type="submit" />
  </form>
);

解决方案

offical example 中提出的解决方案对我来说有点冗长,但目前有效。

您需要将寄存器名称转换为文字:

<input key={field.id} {...register(`test.${index}.test` as const)}  />

但是,如果 index 是数字,则上述解决方案不起作用。当您将文字与数字混合时,如下所示:

`test.${index}.test`

因为 index 可以是任意数字,所以 typescript 无法将其强制转换为精确值。文档中提出的解决方法是手动转换为文字:

{...register(`test.${index}.test` as `test.0.test`)}

C# @string $string $@string

C# @string $string $@string

@string  保证换行后也属于同一个字符串  (请特别注意 \r\n 这样也会直接输入,不在起到换行的效果)

string execSql = @" SELECT

  T1.ProcInstID,T1.Folio,T1.ApplyID,T2.RowID,T2.CurWorkFlowStep,T2.CurAuditor,T2.ModDate
   FROM dbo.WF_ApplyInstance T1";

$string  让 {} 里变为可编译,能输入参数,  要输出 {}  就需要 {{  }}

string name = "gyg";

string sql = $"select * from member where name = ''{name}''";

$@string 可同步实现上面的两个效果

比如:

string type = "测试";
var sql = $@"
  SELECT
    T1.ProcInstID,
    T1.Folio,
    T2.RowID,
    T2.CurWorkFlowStep,
    T2.CurAuditor,
    T2.ModDate
  FROM
    dbo.WF_ApplyInstance T1
  RIGHT JOIN dbo.WF_ApplyInstanceStateDetail T2 ON T2.ApplyID = T1.ApplyID
  WHERE
    T1.ApplyTypeName = ''{type}''
  AND T1.CurState = '' 审批中 ''";

c# String ,String[] 和 List<String>之间的转换

c# String ,String[] 和 List之间的转换

 C#对字符串进行处理时,经常需要进行String,String[]和List<String>之间的转换

本文分析一下它们的差异和转换

一.

  1. String > String[]

String s = "ab cd ef gh";
String[] sArray = s.Split('' '');

  2. String[] > String

string[] sArray = {"ab", "cd", "ef", "gh"};
string s = String.Join(" ", sArray);
//s = "ab cd ef gh";

  3.String[] > List<String>

string[] sArray = { "ab", "cd", "ef", "gh" };
List<String> list = new List<string>(sArray);

  4.List<String> > String[]

List<String> list = new List<string>();
list.Add("ab");            
list.Add("cd");            
list.Add("ef");            
list.Add("gh");        
string[] sArray = list.ToArray();

  5.String和List<String>之间的转换可以使用String[]来中转完成

二.

  1. String类型有很多常用的字符串操作成员

    

    字符串是不可变的,虽然这些方法看起来都会改变字符串对象,其实,它们不会改变而是返回了新的

    副本。对于一个String,任何“改变”都会分配一个新的恒定字符串。 

String s = "ab cd ef gh";
Console.WriteLine("{0}", s.ToUpper());
Console.WriteLine("{0}", s);
/*
返回结果:
AB CD EF GH
ab cd ef gh
*/

    2. String[]是定长的,String[]一般是在确定字符串数组的长度的情况下使用 

    3. List< String >一般在数组的长度会发生变化的情况下使用,例如在数组中间插入一个字符串

 

c# – string.Equals(“string”)和“String”.Equals(string)有什么区别?

c# – string.Equals(“string”)和“String”.Equals(string)有什么区别?

以下两行代码与字符串值进行比较有什么不同.
string str = "abc";

if(str.Equals("abc"))

if("abc".Equals(str))

在第一行我调用字符串变量的equals方法来与字符串文字进行比较.第二行反之亦然.它只是编码风格的区别,或者编译器处理这两个语句的方式有所不同.

解决方法

是的,编译器处理语句的方式是不同的.大多数语言中String的函数等于相同的准则.这是一个半码:
override def Equals(that:String):Boolean //Should override Object.Equals
  if(that==null) return false
  for i from 0 to this.length
    if(!this(i).Equals(that(i))) return false
  return true

通常,该方法将检查该字符串是否为IS,并且该长度与该长度相同.

如其他人所指出的那样,如果该值为null,那么该方法返回false.另一方面,该方法是String的一部分,因此不能在null上调用.这就是为什么在你的exampleif中,str为null,你会得到一个NullReferenceException.

话虽如此,如果你知道这两个变量是非空字符串的长度相同,两个语句都将同时评估.

今天关于Swift String 罕见崩溃swift string nsstring的介绍到此结束,谢谢您的阅读,有关'string' 类型的参数不能分配给 '`${string}` 类型的参数 | `${string}.${string}` | `${string}.${number}`'、C# @string $string $@string、c# String ,String[] 和 List之间的转换、c# – string.Equals(“string”)和“String”.Equals(string)有什么区别?等更多相关知识的信息可以在本站进行查询。

本文标签: