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

如何在Swift中编写通用的apply()函数?

蒋高扬
2023-03-14
问题内容

有什么办法可以使以下在Swift 3中正常工作?

 let button = UIButton().apply {
        $0.setImage(UIImage(named: "UserLocation"), for: .normal)
        $0.addTarget(self, action: #selector(focusUserLocation), 
                     for: .touchUpInside)
        $0.translatesAutoresizingMaskIntoConstraints = false
        $0.backgroundColor = UIColor.black.withAlphaComponent(0.5)
        $0.layer.cornerRadius = 5
     }

apply<T>功能应该采取型的封闭(T)->Void,运行它传递self到它,然后简单地返回self

另一个选择是为此使用运算符,例如“
=>”(从Kotlin和Xtend语言中借用了这个想法)。

试图做这样的扩展NSObject

extension NSObject {   
    func apply<T>(_ block: (T)->Void) -> T
    {
        block(self as! T)
        return self as! T
    }
}

但是它需要在闭包中显式声明参数类型:

let button = UIButton().apply { (it: UIButton) in
        it.setImage(UIImage(named: "UserLocation"), for: .normal)
        it.addTarget(self, action: #selector(focusUserLocation), 
                     for: .touchUpInside)
        ...

这不方便,并且使整个想法不值得付出努力。类型已经在对象创建时指定,并且应该有可能不明确地重复它。

谢谢!


问题答案:

HasApply协议

首先让我们定义HasApply协议

protocol HasApply { }

和相关扩展

extension HasApply {
    func apply(closure:(Self) -> ()) -> Self {
        closure(self)
        return self
    }
}

接下来让make NSObject符合HasApply

extension NSObject: HasApply { }

而已

让我们测试一下

let button = UIButton().apply {
    $0.titleLabel?.text = "Tap me"
}

print(button.titleLabel?.text) // Optional("Tap me")

注意事项

我不会使用NSObject(这是Objective-C处事方式的一部分,我认为将来会在某些时候删除它)。我更喜欢类似的东西UIView

extension UIView: HasApply { }


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

  • 问题内容: 我想在Swift中编写一个方法。在这里,我在Objective-C中初始化一个类: 如何在Swift中编写此方法? 问题答案: 我想这可能是您上课的良好基础 我想避免将键复制粘贴到项目中,因此我将可能的键放入这样的示例中: 并且您可以像这样改进您的方法,并且将来您可以避免代码中任何可能的键错误: 注意:那只是如何做的一个原始想法,根本不需要使用便捷的初始化程序,但是对于我对您的最终课程

  • 我正在修改一个关于开发者推荐的插件(见最新帖子),该插件建议在Wordpress的中编写一些Javascript。 现在,当我这样做的时候,我的整个WordPress变成了空白。嗯,经过一点思考..."你不能在PHP中写纯Javascript"... 所以我把它们写在一个

  • 问题内容: 我是Firebase的新手。我正在使用admin sdk(java code)将数据存储在firebase数据库中。我已经成功完成了这一部分。现在我想在创建数据库条目和通知时写火基础云函数 由于我在Internet上搜索了更多内容,因此仅找到了node.js代码。 https://firebase.google.com/docs/functions/开始 是否可以使用admin SDK

  • 本文向大家介绍如何在Python中编写递归函数?,包括了如何在Python中编写递归函数?的使用技巧和注意事项,需要的朋友参考一下 一个递归 函数是它的执行过程中调用自身的函数。这使函数可以重复多次,输出结果和每次迭代的结束。递归与无限有关。  下面是一个递归函数示例,用于查找整数的阶乘。 数字的阶乘 是从1到该数字的所有整数的乘积。  例如,阶乘9(表示为9!)为1 * 2 * 3 * 4 *

  • 我知道如何通过将两个函数作为输入并输出其合成函数来合成两个函数,但如何返回合成函数f(f(…f(x))?谢谢