本篇文章给大家谈谈SwiftString罕见崩溃,以及swiftstringnsstring的知识点,同时本文还将给你拓展'string'类型的参数不能分配给'`${string}`类型的参数|`${
本篇文章给大家谈谈Swift String 罕见崩溃,以及swift string nsstring的知识点,同时本文还将给你拓展'string' 类型的参数不能分配给 '`${string}` 类型的参数 | `${string}.${string}` | `${string}.${number}`'、C# @string $string $@string、c# String ,String[] 和 List
- 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 罕见崩溃
在我的应用程序中,我有一个记录器,可将错误和状态消息写入字符串。它没有写入文件,它只是在没有附加调试会话的情况下发生错误时方便查看。
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}`''
我已将 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
@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之间的转换
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)有什么区别?
string str = "abc"; if(str.Equals("abc"))
和
if("abc".Equals(str))
在第一行我调用字符串变量的equals方法来与字符串文字进行比较.第二行反之亦然.它只是编码风格的区别,或者编译器处理这两个语句的方式有所不同.
解决方法
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
本文标签: