Swift 4中PKPaymentButton的init(type:style)不可用问题求助
Hey there! Let me break down what's happening here and answer your questions clearly:
这是不是Swift的Bug?
绝对不是——这个问题其实是Swift 4引入的Objective-C API命名规范优化(来自SE-0005提案)导致的预期行为,而非语言bug。
在Swift 3.2及更早版本中,Objective-C的-initWithType:style:方法会被映射成PKPaymentButton(type:style:)。但Swift 4为了让Objective-C API更贴合Swift的命名习惯,将这个初始化方法重命名为PKPaymentButton(paymentButtonType:paymentButtonStyle:)。原来的init(type:style:)在Swift 4环境下就会被标记为不可用,这是编译器遵循新命名规则的正常表现。
你切换到Swift 3.2能编译成功,只是因为Swift 3.2还保留着旧的API映射逻辑,并没有采用Swift 4的新命名规范。
有没有人提交过相关Bug报告?
因为这是Apple明确的API命名调整,而非意外问题,所以这个情况不会被归类为bug,自然也不会有针对这个现象的有效bug报告。实际上,很多开发者在Swift 4刚推出时都遇到过类似的Objective-C API命名适配问题,相关讨论在开发者社区里很常见,大家的解决方案都是改用Swift 4对应的新方法名,而非提交bug。
快速解决方法(不用切换Swift版本)
如果你想留在Swift 4环境下解决这个问题,只需要把初始化代码改成新的命名格式即可:
// Swift 4及以后的正确写法 let paymentButton = PKPaymentButton(paymentButtonType: .plain, paymentButtonStyle: .black)
这样就能正常编译,不用再切换到Swift 3.2啦。
内容的提问来源于stack exchange,提问作者YogiAR

