簡體   English   中英

Swift NSSet和CoreData

[英]Swift NSSet & CoreData

我正在嘗試將一個客觀的C&CoreData應用程序移動到Swift和iOS,並通過迭代NSSet對象來打磚牆:

Xcode生成了這些類:

class Response: NSManagedObject {
    @NSManaged var responseText: String
    @NSManaged var score: NSNumber
    @NSManaged var answers: NSSet
    @NSManaged var question: Question
}

class Question: NSManagedObject {
    @NSManaged var questionText: String
    @NSManaged var questionType: String
    @NSManaged var qualifier: Qualifier
    @NSManaged var responses: NSSet
}

然后在第3課我要添加一個需要迭代NSSet的方法..

class Answer: NSManagedObject {

    @NSManaged var evaluation: Evaluation
    @NSManaged var response: Response

    func scoreGap() -> Int {
        var max = 0
        for aresponse in self.response.question.responses {

            // this next line throws an error
            var scoreVal = aresponse.score.integerValue

            if scoreVal > max { max = scoreVal }
        }
        return max - self.response.score.integerValue
    }
}

上面注釋后面的行給出了錯誤“AnyObject沒有名為score的成員”

Objective-C方法看起來像這樣,工作正常:

// returns the gap between the score of this answer and the max score
-(NSNumber *)scoreGap
{
    long max = 0;
    for(Response *aresponse in self.response.question.responses) {
        if(aresponse.score.longValue > max) max = aresponse.score.longValue;
    }   
    max = max - self.response.score.longValue;
    return @(max);
}

這是關於Swift的第三天,所以我可能會遺漏一些非常明顯的東西......但此刻我真的不明白!

for aresponse in self.response.question.responses {
    // this next line throws an error
    var scoreVal = aresponse.score.integerValue

問題是, for aresponse in ... responses是通過NSSet迭代。 斯威夫特不知道什么是 NSSet中,所以它把每個值aresponse作為AnyObject,它沒有屬性。 因此,當您嘗試獲取aresponsescore屬性時,編譯器會抱怨。

,另一方面,知道每個值aresponse是一個響應。 所以你需要通過強制轉換(使用as )來告訴 Swift。 請注意,您實際上是在Objective-C代碼中執行此操作:

for(Response *aresponse in self.response.question.responses)

但你忘了在Swift做同樣的事情。 你可以用各種方式做到這一點; 例如,你可以寫這種東西:

for aresponse in self.response.question.responses {
    var scoreVal = (aresponse as Response).score.integerValue

這讓我們超越了編譯器,編譯器現在分享我們對這個變量的真正含義。

一旦你習慣了這一點,你就會親吻斯威夫特走過的地面。 所有這一次,在Objective-C中,你在假設你擁有什么樣的對象,但事實上你所擁有的是一個id ,編譯器讓你發送任何消息 - 所以,你經常會這樣做與“無法識別的選擇器”崩潰。 在Swift中,“無法識別的選擇器”崩潰基本上是不可能的,因為指定了所有類型,編譯器不會讓你首先向對象發送不適當的消息。

其實我發現了一些可能有用的東西。 從版本Xcode 7.2和Swift 2.0開始,以下聲明有效:

@NSManaged var responses: Set<Response>

我認為這可能與Swift在NSSet和NSArray之間自動橋接的事實有關。 我沒有發現這個記錄,但它對我有用,如果有人確認,我將不勝感激。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM