当前位置: 首页 > 面试题库 >

如何在Swift中编写init方法?

颛孙俊
2023-03-14
问题内容

我想init在Swift中编写一个方法。在这里,我NSObject在Objective-C中初始化一个类:

-(id)initWithNewsDictionary:(NSDictionary *)dictionary
{
    self = [super init];
    if (self) {
        self.title           = dictionary[@"title"];
        self.shortDescription = dictionary[@"description"];
        self.newsDescription = dictionary[@"content:encoded"];
        self.link            = dictionary[@"link"];
        self.pubDate         = [self getDate:dictionary[@"pubDate"]];

    }
    return self;
}

如何在Swift中编写此方法?


问题答案:

我想这可能是您上课的良好基础

class MyClass {

    // you may need to set the proper types in accordance with your dictionarty's content
    var title: String?
    var shortDescription: String?
    var newsDescription: String?
    var link: NSURL?
    var pubDate: NSDate?

    //

    init () {
        // uncomment this line if your class has been inherited from any other class
        //super.init()
    }

    //

    convenience init(_ dictionary: Dictionary<String, AnyObject>) {
        self.init()

        title = dictionary["title"] as? NSString
        shortDescription = dictionary["shortDescription"] as? NSString
        newsDescription = dictionary["newsDescription"] as? NSString
        link = dictionary["link"] as? NSURL
        pubDate = self.getDate(dictionary["pubDate"])

    }

    //

    func getDate(object: AnyObject?) -> NSDate? {
        // parse the object as a date here and replace the next line for your wish...
        return object as? NSDate
    }

}

我想避免将键复制粘贴到项目中,因此我将可能的键放入enum这样的示例中:

enum MyKeys : Int {
    case KeyTitle, KeyShortDescription, KeyNewsDescription, KeyLink, KeyPubDate
    func toKey() -> String! {
        switch self {
        case .KeyLink:
            return "title"
        case .KeyNewsDescription:
            return "newsDescription"
        case .KeyPubDate:
            return "pubDate"
        case .KeyShortDescription:
            return "shortDescription"
        case .KeyTitle:
            return "title"
        default:
            return ""
        }
    }
}

并且您可以convenience init(...)像这样改进您的方法,并且将来您可以避免代码中任何可能的键错误:

convenience init(_ dictionary: Dictionary<String, AnyObject>) {
    self.init()

    title = dictionary[MyKeys.KeyTitle.toKey()] as? NSString
    shortDescription = dictionary[MyKeys.KeyShortDescription.toKey()] as? NSString
    newsDescription = dictionary[MyKeys.KeyNewsDescription.toKey()] as? NSString
    link = dictionary[MyKeys.KeyLink.toKey()] as? NSURL
    pubDate = self.getDate(dictionary[MyKeys.KeyPubDate.toKey()])

}

注意:那只是如何做的一个原始想法,根本不需要使用便捷的初始化程序,但是对于我对您的最终课程一无所知,这看起来是显而易见的选择–您仅共享一种方法。



 类似资料:
  • 问题内容: 我正在跟踪Swift和Objective-C Runtime,它适用于常规方法。 我喜欢使用init方法,据我了解,init就像一个类方法。因此,我尝试将初始化作为实例和类方法。但这似乎不起作用 我可以使用Objective C使其工作,只是想知道如何在Swift中使其工作 摘录自我的要旨 问题答案: 为方法创建选择器时,应使用Obj C方法签名作为选择器的基础,因为使用Obj C运行

  • 问题内容: 我正在尝试将此代码更新为快速3: 到目前为止,我只是尝试了编译器给出的自动更正。结果是这样的代码: 不幸的是,这并没有使我走得太远,从而导致了其他错误。 有没有人解决这个问题? 请注意,我只是尝试如何编写通知。我(尚未)尝试修复通知功能。 问题答案: 斯威夫特4 您还可以在这些方法中使用以下代码获取键盘信息。

  • 问题内容: 有什么办法可以使以下在Swift 3中正常工作? 该功能应该采取型的封闭,运行它传递到它,然后简单地返回。 另一个选择是为此使用运算符,例如“ ”(从Kotlin和Xtend语言中借用了这个想法)。 试图做这样的扩展: 但是它需要在闭包中显式声明参数类型: 这不方便,并且使整个想法不值得付出努力。类型已经在对象创建时指定,并且应该有可能不明确地重复它。 谢谢! 问题答案: HasApp

  • 我正在为我的HeapSort静态方法开发一个辅助方法私有E sortRemove()。让我注意一下,这个堆是一个MaxHeapPriorityQueue,它的所有元素都有一个子元素,其值小于父元素。 我正在努力 重复调用删除,直到堆为空。 但是,当一个元素被“删除”时,它被移动到数组的末尾,而不是完全从数组中逐出。 当你完成时,瞧!数组已排序。 我试图弄清楚如何让这个算法适合我的代码。 因此我有:

  • 问题内容: 在Swift 2中,我能够使用大型中央调度来延迟动作: 但是,自Swift 3起,似乎不再可以编译了。在现代Swift中编写此代码的首选方法是什么? 问题答案: 语法很简单: 请注意,上述添加为a的语法似乎是造成混乱的根源(特别是因为我们习惯于添加nsec)。之所以可以使用“ add seconds as ”语法,是因为a 和在幕后,有一个运算符将占用a 并将其增加很多秒: 但是,如果