Swift4.0+中一個容易被忽略的問題
阿新 • • 發佈:2019-01-06
本貓的專案在將Swift語言升級到4.0之後時,發現一個隱藏的問題,可能大家沒太注意過.
存在一個繼承於UICollectionViewController的類
open class EPCalendarPicker: UICollectionViewController {
}
它實現了若干個UICollectionViewController的協議方法,其中一個為:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets
因為介面中Section間的上下間距過小,所以讓其返回一個合適的UIEdgeInsets值.
但是無論怎麼設定,UICollectionViewController介面中Section間距都無任何變化,難道是用錯了???
在其中下斷點,發現根本沒有回撥該方法!!!
檢查發現因為該協議方法是一個可選方法:
public protocol UICollectionViewDelegateFlowLayout : UICollectionViewDelegate {
@available(iOS 6.0, *)
optional public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets
}
測試發現若可選方法不加@objc字首,runtime會認為你沒有實現該方法,從而不會呼叫該方法。
但Xcode中編譯器並沒有提示我該方法要加@objc… -_-b
但該問題在Swift3.0-中貌似不存在,希望予以留意。