需要澄清" @objc class"在斯威夫特

时间:2015-08-15 01:52:06

标签: swift class protocols optional

我明白了" @ objc"属性适用于协议。我不明白为什么它被添加到类中,例如在以下示例中:

@objc protocol CounterDataSource {
    optional func incrementForCount(count: Int) -> Int
    optional var fixedIncrement: Int { get }
}

@objc class Counter {
    var count = 0
    var dataSource: CounterDataSource?
    func increment() {
        if let amount = dataSource?.incrementForCount?(count) {
            count += amount
        } else if let amount = dataSource?.fixedIncrement {
            count += amount
        }
    }
}

以下是Apple的Swift文档中的内容:

  

另请注意,@ objc协议只能由类采用,而不能由结构或枚举采用。如果将协议标记为@objc以指定可选要求,则只能将该协议应用于类类型。

没有解释" @objc类..",只有" @objc协议"。

2 个答案:

答案 0 :(得分:1)

关于类声明的

NSObject意味着带注释的类将暴露给Objective-C运行时。但是还有其他隐含的差异,但我认为这是最重要的差异。

您可以尝试从纯Swift类(而不是NSObject的子类)中省略注释,然后您无法在Objective-C代码中使用此类(它不会出现在使用的生成头文件中通过您的Objective-C代码)。

注意任何继承@objc或其任何子类的类都会自动(隐式)标记为UIViewController。因此,将@objc的子类明确标记为using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PrimeNumberHelp { class Program { private static int Max = 100; static void Main(string[] args) { List<int> Primes = new List<int>(); int current = 0; while (current <= 100) { if (IsPrime(current)) Primes.Add(current); current++; } Console.WriteLine(Primes[23]); Console.ReadKey(); } private static bool IsPrime(int number) { if (number == 1) return false; if (number == 2) return true; if (number % 2 == 0) return false; for (int i = 3; i * i <= number; i += 2) { if (number % i == 0) return false; } return true; } } } 是没有意义的,因为Swift编译器会为您执行此操作。

答案 1 :(得分:0)

this page上,它说

  

如果将objc属性应用于类或协议,则会将其隐式应用于该类或协议的成员。编译器还隐式地将objc属性添加到从另一个标有objc属性的类继承的类中。标有objc属性的协议不能从不符合协议的协议继承。

所以,不同之处在于它隐含地适用于所有成员。此外,您将无法将@objc添加到通用类。