1. 程式人生 > >Swift4.0+中一個容易被忽略的問題

Swift4.0+中一個容易被忽略的問題

本貓的專案在將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-中貌似不存在,希望予以留意。