gpt4 book ai didi

objective-c - Swift:替代父类(super class)方法来生成对象

转载 作者:搜寻专家 更新时间:2023-11-01 06:34:10 25 4
gpt4 key购买 nike

我尝试将以下 Objective-C 代码转换为 swift:

-(id)initWithBook:(NSString*)bookTitle author:(NSString*)author description:(NSString*)description{
self = [super init];
if (self) {
self.bookTitle = [bookTitle copy];
self.author = [author copy];
self.description = [uri description];
}
return self;
}

+(NSArray*)listOfBooks:(NSArray*)jsonWithBooks{

NSMutableArray *elements = [NSMutableArray new];
for (NSDictionary *dictElment in jsonRespnse){
Books *booksData = [[Books alloc] initWithBook:[dictElment objectForKey:@"bookTitle"]
title:[dictElment objectForKey:@"author"]
description:[dictElment objectForKey:@"description"]];
[elements addObject:booksData];
}
return [NSArray arrayWithArray:elements];
}

在我的 Objective-C 代码中,我调用父类(super class)“+(NSArray*)listOfBooks:(NSArray*)jsonWithBooks”来生成对象的 NSArray。但我还没有在 Swift 上找到一个等价物。你们中有人知道做这样的事情的最佳选择是什么吗?

我正在尝试使用@Alexander 示例,但我的项目在以下行中崩溃:

let inventoryBooks = Book.books(fromDictArray: json .object(forKey: "books") as! [[String : String]] )

我为此检查类型:

json .object(forKey: "books")

如下:

let arrayOfBooks = json .object(forKey: "books")
if arrayOfBooks is NSArray {
print("nsarray")
}

if arrayOfBooks is [[String:String]] {
print("string:string")
}
if arrayOfBooks is NSDictionary {
print("NSDic")
}

并且正在打印 nsarray

我的问题。我做错了什么或者我需要更改此功能的签名:

 static func books(fromDictArray array: [[String: String]]) -> [Book?] {
return array.map(Book.init)
}

此 json 响应示例:

{
books = (
{
caption = "";
"display_sizes" =(
{
name = thumb;
uri = "https://someUrl.com/img.jpg";
}
);
id = 123;
"max_dimensions" = {
height = 4912;
width = 7360;
};
title = "Learning Swift";
author = "Some guy"
}
{
caption = "";
"display_sizes" =(
{
name = thumb;
uri = "https://someUrl.com/img.jpg";
}
);
id = 123;
"max_dimensions" = {
height = 4912;
width = 7360;
};
title = "Swift";
author = "me meme"
}
)
}

最佳答案

以下是我如何使用惯用的 Swift 编写这段代码:

struct Book {
let title: String
let author: String
let description: String

/* an implicit member wise initializer is generated,
which would otherwise look something like this:
init(title: String, author: String, description: String) {
self.title = title
self.author = author
self.description = description
} */
}

// Initialization from Dictionaries
extension Book {
init?(fromDict dict: [String: Any]) {
guard
let title = dict["bookTitle"] as? String,
let author = dict["author"] as? String,
let description = dict["description"] as? String
else { return nil }

self.init(
title: title,
author: author,
description: description
)
}

static func books(fromDictArray array: [[String: Any]]) -> [Book?] {
return array.map(Book.init)
}
}

这里有一些值得注意的点:

  1. Book是一个结构。对一本书的如此广泛的描述不需要支持身份的概念。也就是说,你的书名为“哈利波特”,作者是“J.K.罗琳”,描述为“一些描述”,可以认为与我的书具有相同的值(value)。显然(目前)还没有必要区分你的书和我的书的身份。

  2. Book有一个隐式成员初始化器 init(title:author:description:)它只是将其字段初始化为给定的参数。

  3. 进行了扩展,将所有与字典相关的任务划分为一个单元。

  4. 一个可失败的初始化器,init?(fromDictArray:)制作完成,它会根据给定的字典返回一本新书(大概是从您的 JSON 创建的)。这个初始化器是容错的。如果提供的字典无效,那么初始化程序将简单地返回 nil ,不会让您的程序崩溃。

  5. A static方法是在 Book 上制作的结构,books(fromDictArray:) ,这将创建一个可选书籍数组( [Book?] ,又名 Array<Optional<Book>> 从给定的字典中。然后,此方法的使用者的工作是处理 nil 值,这些值是由无效的字典产生的,随心所欲。

    • 他们可以忽略 nil书籍:

      let books = Book.books(fromDictArray: myDictArray).flatMap{$0}
    • 如果 nil 它们可能会崩溃找到书:

      let books = Book.books(fromDictArray: myDictArray) as! [Book]
    • 或者他们可以以某种独特的方式处理 nil 情况:

      let books = Book.books(fromDictArray: myDictArray).map{ book in
      if book == nil {
      print("A nil book was found")
      }
      }

关于objective-c - Swift:替代父类(super class)方法来生成对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43526820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com