![](/img/trans.png)
[英]Swift and CoreData, problems with relationship (NSSet) - [NSSet intersectsSet:]: set argument is not an NSSet
[英]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,它沒有屬性。 因此,當您嘗試獲取aresponse
的score
屬性時,編譯器會抱怨。
而你 ,另一方面,知道每個值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.