5

Bonjour、アーロンの本から客観的な演習を迅速に翻訳したいのですが、解決策が見つかりません. Objective'c コードは次のとおりです。

@dynamic firstName;
@dynamic lastName;
@dynamic department;

+ (NSSet *)keyPathsForValuesAffectingFullName
{
    return [NSSet setWithObjects:@"firstName", @"lastName", nil];
}

- (NSString *)fullName
{
    NSString *first = [self firstName];
    NSString *last = [self lastName];
    if (!first)
        return last;
    if (!last)
        return first;
    return [NSString stringWithFormat:@"%@ %@", first, last];
}

開発者向けドキュメントで関数を見つけましたが、このコードの実装方法がわかりません。

より明確にするために、これはAppleのドキュメントです

一対一の関係

対 1 関係の通知を自動的にトリガーするには、keyPathsForValuesAffectingValueForKey: をオーバーライドするか、依存キーを登録するために定義されたパターンに従う適切なメソッドを実装する必要があります。

たとえば、個人のフル ネームは姓と名の両方に依存します。完全な名前を返すメソッドは、次のように記述できます。

- (NSString *)fullName {
    return [NSString stringWithFormat:@"%@ %@",firstName, lastName];
}

fullName プロパティを監視するアプリケーションは、firstName プロパティまたは lastName プロパティのいずれかが変更されたときに通知を受ける必要があります。これらはプロパティの値に影響を与えるためです。

1 つの解決策は、keyPathsForValuesAffectingValueForKey をオーバーライドすることです。つまり、個人の fullName プロパティが lastName および firstName プロパティに依存するように指定します。リスト 1 は、そのような依存関係の実装例を示しています。

リスト 1 keyPathsForValuesAffectingValueForKey の実装例:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {

    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

    if ([key isEqualToString:@"fullName"]) {
        NSArray *affectingKeys = @[@"lastName", @"firstName"];
        keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
    }
    return keyPaths;
}

class func keyPathsForValuesAffectingValueForKey(_ key: String) -> NSSet

この機能を迅速に実装する方法を教えてもらえますか?

助けてくれてありがとう。

4

6 に答える 6

2

Swift 4 ソリューションの場合:

@objc dynamic var firstName: String = ""
@objc dynamic var lastName: String = ""
@objc dynamic var fullName: String {
  return "\(firstName) \(lastName)"
}

@objc class func keyPathsForValuesAffectingFullName() -> Set<String> {
  return Set(["firstName", "lastName"])
}
于 2016-04-30T19:18:56.120 に答える
-1

名前や部門がいつ更新されたかを確認したい場合は、次のdynamicように Swift のキーワードを使用します。

dynamic var firstName: String

次に、 Adopting Cocoa Design Patterns Guideに従って、Swift で Key-Value 観察を採用することに関する Apple のドキュメントに従うことができます。

概要:

  1. dynamic観察したい任意のプロパティにキーワードを追加します。
  2. Apple のドキュメントに従って、グローバル コンテキスト変数を作成します。
  3. メソッドをオーバーライドしobserveValueForKeyPathます。
于 2015-02-02T07:26:16.480 に答える