GVKun编程网logo

Swift:参数类型'[String:ValueType]’不符合预期类型’AnyObject’

1

对于Swift:参数类型'[String:ValueType]’不符合预期类型’AnyObject’感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于'string'类型的参数不能分配给'`

对于Swift:参数类型'[String:ValueType]’不符合预期类型’AnyObject’感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于'string' 类型的参数不能分配给 '`${string}` 类型的参数 | `${string}.${string}` | `${string}.${number}`'、c# – string.Equals(“string”)和“String”.Equals(string)有什么区别?、Flutter 2.0 迁移:_InternalLinkedHashMap 不是 Map 类型的子类型?类型转换、Flutter:面临这样的错误 - 参数类型 'Map?'不能分配给参数类型 'Map'的宝贵知识。

本文目录一览:

Swift:参数类型'[String:ValueType]’不符合预期类型’AnyObject’

Swift:参数类型'[String:ValueType]’不符合预期类型’AnyObject’

我有以下代码尝试将字典转换为NSData:

func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData {
    return NSKeyedArchiver.archivedDataWithRootObject(dict)
}

编译器给我传递dict作为参数的错误:

参数类型''[String:ValueType]’不符合预期类型’AnyObject’

编辑:

@ vadian的解决方案对我有用.

我还尝试将dict转换为NSDictionary:

return NSKeyedArchiver.archivedDataWithRootObject(dict as NSDictionary)

但是得到这个错误:

无法将''[String:ValueType]’类型的值转换为强制中的’NSDictionary’类型

为什么?

解决方法

由于archivedDataWithRootObject期望AnyObject只是转换字典

func dataFromDict<ValueType>(dict: [String:ValueType]) -> NSData {
  return NSKeyedArchiver.archivedDataWithRootObject(dict as! AnyObject)
}

'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.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.

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

Flutter 2.0 迁移:_InternalLinkedHashMap<String,String?> 不是 Map<String,String> 类型的子类型?类型转换

Flutter 2.0 迁移:_InternalLinkedHashMap 不是 Map 类型的子类型?类型转换

如何解决Flutter 2.0 迁移:_InternalLinkedHashMap<String,String?> 不是 Map<String,String> 类型的子类型?类型转换

我正在尝试将我的应用程序迁移到 Flutter 2.0。我已经完成了过渡。但是现在,我的 API 调用出现多个错误。在迁移之前,一切正常。

以下是我尝试从 API 获取文章时出现这些错误的示例。我有一个 JsonWebToken 来保护我的通话。

再一次,在迁移之前,一切都运行良好。有什么想法吗?

解决方法

看签名:

_InternalLinkedHashMap<String,String?>
                   Map<String,String>?

含义 headerJWT 要求第二个类型参数可以为空。

这会起作用:

void main() {
  final Map<String,String?> foo = {};
  foo as Map<String,String?>?;
}

但这不会:

void main() {
  final Map<String,String>?;
}

Flutter:面临这样的错误 - 参数类型 'Map<String, dynamic>?'不能分配给参数类型 'Map<String, Object?>'

Flutter:面临这样的错误 - 参数类型 'Map?'不能分配给参数类型 'Map'

如何解决Flutter:面临这样的错误 - 参数类型 ''Map<String, dynamic>?''不能分配给参数类型 ''Map<String, Object?>''

我正在练习 Flutter SQFLite。这就是我为用户信息创建模型的原因。这是我的模型代码-

  1. class Contact {
  2. static const tblContact = "contacts";
  3. static const colId = "id";
  4. static const colName = "name";
  5. static const colMobile = "mobile";
  6. Contact({
  7. this.id,this.name = '''',this.mobile = '''',});
  8. int? id;
  9. String name;
  10. String mobile;
  11. Map<String,dynamic>? toMap() => {
  12. "id": colId,"name": colName.toString(),"mobile": colMobile.toString(),};
  13. factory Contact.fromMap(Map<String,dynamic> json) =>
  14. Contact(name: json[colName],mobile: json[colMobile]);
  15. }

然后我创建了一个数据库助手,用于从数据库中插入和获取数据。但是我在插入值时遇到了问题(不能将参数类型 ''Map?'' 分配给参数类型 ''Map'' )。这是我的数据库助手代码 -

  1. import ''dart:io'';
  2. ......
  3. .......
  4. class DatabaseHelper {
  5. static const _databaseName = "ContactData.db";
  6. static const _databaseVersion = 1;
  7. //<====== Singleton Class
  8. DatabaseHelper._();
  9. static final DatabaseHelper instance = DatabaseHelper._();
  10. Database? _database;
  11. Future<Database?> get database async {
  12. if (_database != null) {
  13. return _database;
  14. } else {
  15. _database = await _initDatabase();
  16. return _database;
  17. }
  18. }
  19. //CREATE DATABASE
  20. _initDatabase() async {
  21. Directory dataDirectory = await getApplicationDocumentsDirectory();
  22. String dbPath = join(dataDirectory.path,_databaseName);
  23. print(dbPath);
  24. return await openDatabase(dbPath,version: _databaseVersion,onCreate: _onCreate);
  25. }
  26. //CREATE TABLE
  27. _onCreate(Database db,int version) async {
  28. db.execute(''''''
  29. CREATE TABLE ${Contact.tblContact}(
  30. ${Contact.colId} INTEGER PRIMARY KEY AUTOINCREMENT,${Contact.colName} STRING NOT NULL,${Contact.colMobile} STRING NOT NULL
  31. );
  32. '''''');
  33. print("Done on Create");
  34. }
  35. //<=================== ADD DATA
  36. Future<int> insertContact(Contact contact) async {
  37. Database? db = await database;
  38. return await db!.insert(Contact.tblContact,contact.toMap());
  39. }
  40. //<==================== Read Data
  41. Future<List<Contact>> fetchContacts() async {
  42. Database? db = await database;
  43. List<Map<String,dynamic>> contacts = await db!.query(Contact.tblContact);
  44. print("Done Fetch");
  45. return contacts.length == 0
  46. ? []
  47. : contacts.map((x) => Contact.fromMap(x)).toList();
  48. }
  49. }

错误:

我的问题在哪里,我错过了什么?请有人帮我解决这个问题。

更新: 我更改了参数类型“Map?”到“映射?”但现在我发现了另一个错误。

  1. The argument type ''Map<String,dynamic>?'' can''t be assigned to the parameter type ''Map<String,Object?>''.

最近的错误:

解决方法

您收到此错误是因为在插入函数中,地图类型为 <String,Object?> 并且您正在传递类型为 <dynamic,dynamic> 的地图。尝试改变

  1. Map<dynamic,dynamic>? toMap() => {
  2. "id": colId,"name": colName.toString(),"mobile": colMobile.toString(),};
  3. factory Contact.fromMap(Map<dynamic,dynamic> json) =>
  4. Contact(name: json[colName],mobile: json[colMobile]);

  1. //You don''t need to pass id because it''s auto incremented

[ 为空安全使用 Map<String,Object?> 而不是 Map<String,Object>?]

  1. Map<String,Object?> toMap() => {
  2. "name": colName.toString(),};
  3. factory Contact.fromMap(Map<String,Object?> json) =>
  4. Contact(name: json[colName],mobile: json[colMobile]);
,

你的数据库说他想要一张像

Map<String,Object>

这里地图的键必须是 String

并且您正在传递带有 dynamic 类型密钥的地图

因此将地图的键从 dynamic 更改为 String

更改此地图类型

  1. Map<dynamic,};

  1. Map<String,};

之后你会得到另一个error喜欢

The argument type ''Map<String,dynamic>?'' can''t be assigned to the parameter type ''Map<String,Object?>''.

现在首先我们必须明白 Map<String,Object?> 是什么意思?

类型 Object 是您的地图值必须是特定类型的数据,例如 int double String 或任何 Custom Object 因为 SQL 数据库将数据存储在列和每列必须保持特定的数据类型,所以试试这样

  1. Map<String,Object>? toMap() => {
  2. "id": colId,};
,

改变

  1. Map<dynamic,};

  1. Map<String,};

今天的关于Swift:参数类型'[String:ValueType]’不符合预期类型’AnyObject’的分享已经结束,谢谢您的关注,如果想了解更多关于'string' 类型的参数不能分配给 '`${string}` 类型的参数 | `${string}.${string}` | `${string}.${number}`'、c# – string.Equals(“string”)和“String”.Equals(string)有什么区别?、Flutter 2.0 迁移:_InternalLinkedHashMap 不是 Map 类型的子类型?类型转换、Flutter:面临这样的错误 - 参数类型 'Map?'不能分配给参数类型 'Map'的相关知识,请在本站进行查询。

本文标签: