2017-09-20 42 views
0

我更新項目從斯威夫特3至4雨燕,在Xcode 9didSelectRowAtIndexPath方法禁用@objc推理(Xode 9,斯威夫特4)後不叫

在遷移過程中,當它要求我選擇「 Swift 4 @objc推理「,我選擇」最小化推理(推薦)「。

然後,我按照標題爲「遷移到Swift 4 @objc推理」的Xcode幫助頁中的「完成Swift 4最小化推理遷移」段落中的所有步驟操作。

完成最後兩個步驟後(「打開項目的構建設置;設置Swift 3 @objc推斷爲默認值」),突然間didSelectRowAtIndexPath未在我的應用程序中調用。沒有錯誤或警告,它根本不叫。

回答

2

tl; dr:
原來我需要標記爲@objc其中定義了didSelectRowAtIndexPath的類擴展名。


詳情:

注意的是,儘管在大多數情況下,didSelectRowAtIndexPath在類擴展,用於符合UITableViewDelegate協議的定義,我的設置,因爲繼承是不同的:

我有一個ParentVC和一個ChildVCParentVC通過類擴展符合UITableViewDelegate(在Apple的「The Swift Programming Language(Swift 4)」中,在「添加擴展的協議一致性」下提及此方法)。 ParentVC實現了一些UITableViewDelegate方法,但不執行didSelectRowAtIndexPath

ChildVC其中didSelectRowAtIndexPath實際上被實現。這是在類擴展名(ChildVC)中完成的,但請注意,此類擴展名不包含一致性(: UITableViewDelegate)(ParentVC已經這樣做並且試圖在ChildVC中也會這樣做會導致「冗餘一致性」錯誤)。

因此,將@objc添加到ChildVC的類擴展中解決了該問題。

不知道這是否是Swift/Xcode /編譯器/分析器中的錯誤(可能至少有一個警告是爲了?),或者我用於協議一致性+繼承的方法是否有缺陷,是否願意聽取別人對此的看法。