我明白了" @ 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协议"。
答案 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
添加到通用类。